скайбоксы, рендер воды, документация

This commit is contained in:
2026-06-27 18:33:55 +04:00
parent 579b9e10c9
commit b051012920
14 changed files with 1775 additions and 101 deletions
+18 -15
View File
@@ -6,6 +6,7 @@
class_name WMOBuilder
const M2_BUILDER_SCRIPT := preload("res://addons/mpq_extractor/loaders/m2_builder.gd")
const WOW_LIQUID_MATERIAL := preload("res://addons/mpq_extractor/loaders/wow_liquid_material.gd")
const M2_RIGHT_YAW_OFFSET := PI * 0.5
const BUILD_OCCLUDERS := false
const OCCLUDER_MIN_TRIANGLES := 16
@@ -27,7 +28,7 @@ static func clear_caches() -> void:
_m2_prototype_cache.clear()
_m2_missing_cache.clear()
_texture_cache.clear()
_wmo_liquid_material_cache.clear()
WOW_LIQUID_MATERIAL.clear_cache()
# Returns a Node3D containing one MeshInstance3D per WMO group.
static func build(data: Dictionary, extracted_dir: String = "") -> Node3D:
@@ -339,6 +340,7 @@ static func _build_material(
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
mat.specular_mode = BaseMaterial3D.SPECULAR_DISABLED
mat.vertex_color_use_as_albedo = false
mat.set_flag(BaseMaterial3D.FLAG_USE_TEXTURE_REPEAT, true)
var blend_mode: int = mat_def.get("blend_mode", 0)
match blend_mode:
@@ -356,6 +358,7 @@ static func _build_material(
if tex:
mat.albedo_texture = tex
mat.texture_filter = BaseMaterial3D.TEXTURE_FILTER_LINEAR_WITH_MIPMAPS_ANISOTROPIC
mat.set_flag(BaseMaterial3D.FLAG_USE_TEXTURE_REPEAT, true)
mat.set_meta("wow_flags", mat_def.get("flags", 0))
mat.set_meta("wow_shader", mat_def.get("shader", 0))
@@ -363,7 +366,6 @@ static func _build_material(
return mat
static var _wmo_liquid_material_cache: Dictionary = {}
# WMO MLIQ → MeshInstance3D in WMO-local coordinates.
# Corner & vertex grid are in WMO-local (Z-up); convert to Godot Y-up using the
@@ -384,6 +386,8 @@ static func _build_group_liquid(liquid: Dictionary) -> MeshInstance3D:
return null
var verts := PackedVector3Array()
var nrms := PackedVector3Array()
var uvs := PackedVector2Array()
var indices := PackedInt32Array()
# Pre-compute Godot-space position for each grid vertex.
@@ -417,6 +421,14 @@ static func _build_group_liquid(liquid: Dictionary) -> MeshInstance3D:
verts.append(pos[i10])
verts.append(pos[i11])
verts.append(pos[i01])
nrms.append(Vector3.UP)
nrms.append(Vector3.UP)
nrms.append(Vector3.UP)
nrms.append(Vector3.UP)
uvs.append(Vector2(float(tx) / maxf(1.0, float(xtiles)), float(ty) / maxf(1.0, float(ytiles))))
uvs.append(Vector2(float(tx + 1) / maxf(1.0, float(xtiles)), float(ty) / maxf(1.0, float(ytiles))))
uvs.append(Vector2(float(tx + 1) / maxf(1.0, float(xtiles)), float(ty + 1) / maxf(1.0, float(ytiles))))
uvs.append(Vector2(float(tx) / maxf(1.0, float(xtiles)), float(ty + 1) / maxf(1.0, float(ytiles))))
# Two triangles, winding chosen to face up after the (-y, z, -x) flip.
indices.append(base + 0)
indices.append(base + 1)
@@ -431,6 +443,8 @@ static func _build_group_liquid(liquid: Dictionary) -> MeshInstance3D:
var arrays := []
arrays.resize(Mesh.ARRAY_MAX)
arrays[Mesh.ARRAY_VERTEX] = verts
arrays[Mesh.ARRAY_NORMAL] = nrms
arrays[Mesh.ARRAY_TEX_UV] = uvs
arrays[Mesh.ARRAY_INDEX] = indices
var mesh := ArrayMesh.new()
@@ -443,19 +457,8 @@ static func _build_group_liquid(liquid: Dictionary) -> MeshInstance3D:
return mi
static func _wmo_liquid_material(material_id: int) -> StandardMaterial3D:
if _wmo_liquid_material_cache.has(material_id):
return _wmo_liquid_material_cache[material_id]
var mat := StandardMaterial3D.new()
mat.cull_mode = BaseMaterial3D.CULL_DISABLED
mat.transparency = BaseMaterial3D.TRANSPARENCY_ALPHA
mat.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
# Default: bluish water. Without DBC liquid_type lookup we can't pick magma/slime
# precisely yet — material_id from MLIQ is the WMO MOMT slot, not the DBC id.
mat.albedo_color = Color(0.2, 0.4, 0.7, 0.6)
_wmo_liquid_material_cache[material_id] = mat
return mat
static func _wmo_liquid_material(material_id: int) -> Material:
return WOW_LIQUID_MATERIAL.build_wmo(material_id)
static func _load_texture(rel_path: String, extracted_dir: String) -> Texture2D: