скайбоксы, рендер воды, документация
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user