Implement playable Mac client and rendering validation
This commit is contained in:
@@ -611,12 +611,13 @@ void Metin2World::place_chunk_objects(int tx, int ty, Node3D *root, int &n_obj,
|
||||
}
|
||||
}
|
||||
|
||||
// Tree proxy:每 treefile 一个共享 mesh + MultiMeshInstance3D。
|
||||
// 当前从 .spt 嗅探真实 bark/composite atlas;几何仍等待离线 SpeedTree exporter。
|
||||
// Native extracted tree geometry, shared once per treefile across instances.
|
||||
for (auto &kv : tree_groups) {
|
||||
if (kv.second.xforms.empty())
|
||||
continue;
|
||||
Ref<godot::ArrayMesh> tmesh = get_tree_proxy_mesh(kv.first, *resolver, 12.0f);
|
||||
Ref<godot::ArrayMesh> tmesh = get_tree_mesh(kv.first, *resolver, 12.0f);
|
||||
const bool native = String(tmesh->get_meta("tree_geometry", "proxy")) == "native_spt";
|
||||
(native ? native_trees_placed : proxy_trees_placed) += (int)kv.second.xforms.size();
|
||||
Ref<MultiMesh> mm;
|
||||
mm.instantiate();
|
||||
mm->set_transform_format(MultiMesh::TRANSFORM_3D);
|
||||
@@ -628,6 +629,7 @@ void Metin2World::place_chunk_objects(int tx, int ty, Node3D *root, int &n_obj,
|
||||
mmi->set_name(String("Trees_") + String(kv.first.c_str()).get_file().get_basename());
|
||||
mmi->set_layer_mask(1u << 0);
|
||||
mmi->set_multimesh(mm);
|
||||
mmi->set_meta("tree_geometry", native ? "native_spt" : "proxy");
|
||||
// §3.3: 树影已烘焙进 shadowmap.dds;proxy 几何的实时投影形状也不对 -> 默认不投。
|
||||
mmi->set_cast_shadows_setting(tree_shadows ? GeometryInstance3D::SHADOW_CASTING_SETTING_ON
|
||||
: GeometryInstance3D::SHADOW_CASTING_SETTING_OFF);
|
||||
@@ -827,6 +829,7 @@ void Metin2World::set_focus_position(double gx_m, double gz_m) {
|
||||
}
|
||||
|
||||
void Metin2World::_process(double) {
|
||||
update_water_animation();
|
||||
for (int n = 0; n < stream_budget && !stream_queue.empty(); ++n) {
|
||||
auto [tx, ty] = stream_queue.front();
|
||||
stream_queue.erase(stream_queue.begin());
|
||||
@@ -854,6 +857,7 @@ void Metin2World::unload_map() {
|
||||
chunks_built = chunks_failed = chunks_splatted = 0;
|
||||
objects_placed = objects_skipped = objects_missing_model = 0;
|
||||
trees_placed = tree_species = 0;
|
||||
native_trees_placed = proxy_trees_placed = 0;
|
||||
objects_mdatr_built = 0;
|
||||
build_ms = 0;
|
||||
splat_ready = registry_ok = false;
|
||||
@@ -997,6 +1001,8 @@ Dictionary Metin2World::get_load_report() const {
|
||||
d["ambience_sources"] = (int)ambience_sources.size();
|
||||
d["trees_placed"] = trees_placed;
|
||||
d["tree_species"] = tree_species;
|
||||
d["native_trees_placed"] = native_trees_placed;
|
||||
d["proxy_trees_placed"] = proxy_trees_placed;
|
||||
d["objects_mdatr_built"] = objects_mdatr_built; // 使用 .mdatr 精确碰撞的对象数
|
||||
d["static_meshes"] = static_cache.loaded;
|
||||
d["build_ms"] = build_ms;
|
||||
|
||||
Reference in New Issue
Block a user