From 2b3ba879f05b662f9fc27f3d04ba46d820c5426b Mon Sep 17 00:00:00 2001 From: abramcumner Date: Tue, 4 Oct 2016 13:53:00 +0300 Subject: [PATCH] =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83=20MT4=5F?= =?UTF-8?q?TREE=5FST,=20MT4=5FTREE=5FPM=20=D0=B2=20=D0=B8=D0=B5=D1=80?= =?UTF-8?q?=D0=B0=D1=80=D1=85=D0=B8=D1=87=D0=B5=D1=81=D0=BA=D0=B8=D1=85=20?= =?UTF-8?q?=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D1=8F=D1=85.=20=D0=A2=D0=B5?= =?UTF-8?q?=D0=BF=D0=B5=D1=80=D1=8C=20=D0=B4=D0=BE=D0=BB=D0=B6=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BA=D0=BE=D1=80=D1=80=D0=B5=D0=BA=D1=82=D0=BD=D0=BE=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D0=B2=D0=B5=D1=80=D1=82=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=D1=81=D1=8F=20=D0=B4=D0=B5=D1=80=D0=B5=D0=B2=D1=8C=D1=8F=20?= =?UTF-8?q?=D0=B2=20=D0=9B=D0=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/utils/converter/level_mesh.cxx | 10 ++++++++++ sources/utils/converter/level_mesh.h | 2 ++ sources/utils/converter/level_tools_visuals.cxx | 9 ++++++++- 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/sources/utils/converter/level_mesh.cxx b/sources/utils/converter/level_mesh.cxx index 4cd53905..39ed4495 100644 --- a/sources/utils/converter/level_mesh.cxx +++ b/sources/utils/converter/level_mesh.cxx @@ -89,6 +89,16 @@ void level_mesh::push(uint16_t sector, const xr_vbuf& vb, const xr_ibuf& ib, xr_mesh_builder::__push(vb, ib, 0, face_template); } +void level_mesh::push(uint16_t sector, const xr_vbuf& vb, const xr_ibuf& ib, + uint16_t texture, uint16_t eshader, const fmatrix& xform) +{ + b_face face_template(sector); + face_template.surface.set(texture, eshader); + if (vb.has_lightmaps()) + face_template.surface.flags |= RSF_LIGHTMAP; + xr_mesh_builder::__push(vb, ib, &xform, face_template); +} + void level_mesh::push(uint16_t sector, const xr_vbuf& vb, const xr_ibuf& ib, const fmatrix& xform, uint16_t texture, uint16_t eshader, uint16_t gamemtl) { diff --git a/sources/utils/converter/level_mesh.h b/sources/utils/converter/level_mesh.h index 2ef4fe21..17105d7b 100644 --- a/sources/utils/converter/level_mesh.h +++ b/sources/utils/converter/level_mesh.h @@ -125,6 +125,8 @@ class level_mesh: public xray_re::xr_mesh_builder { uint16_t texture, uint16_t eshader); void push(uint16_t sector, const xray_re::shape_def& shape, const xray_re::fmatrix& xform0, uint16_t texture, uint16_t eshader, uint16_t gamemtl); + void push(uint16_t sector, const xray_re::xr_vbuf& vb, const xray_re::xr_ibuf& ib, uint16_t texture, uint16_t eshader, + const xray_re::fmatrix& xform); void restore_game_materials(const xray_re::xr_cform& cform); void separate_terrain(uint16_t texture); void separate_terrain(uint16_t texture, const xray_re::details_header& header, diff --git a/sources/utils/converter/level_tools_visuals.cxx b/sources/utils/converter/level_tools_visuals.cxx index 98066624..998d12d4 100644 --- a/sources/utils/converter/level_tools_visuals.cxx +++ b/sources/utils/converter/level_tools_visuals.cxx @@ -344,7 +344,14 @@ void level_tools::push_subdivisions_v13(level_mesh* mesh, uint16_t sector_idx, u } else if (ogf->hierarchical()) { for (std::vector::const_iterator it = ogf->children_l().begin(), end = ogf->children_l().end(); it != end; ++it) { - push_subdivisions_v13(mesh, sector_idx, *it); + const xr_ogf* child = m_subdivisions->at(*it); + const xr_ogf_v4* child_4 = reinterpret_cast(child); + if (child->model_type() == MT4_TREE_ST || child->model_type() == MT4_TREE_PM) { + mesh->push(sector_idx, child->vb(), child->ib(), m_uniq_textures[child->texture_l()], + m_uniq_shaders[child->shader_l()], child_4->xform()); + } + else + push_subdivisions_v13(mesh, sector_idx, *it); } } else if (is_compiled_wallmark(ogf->shader_l())) { // FIXME: restore wallmarks here even if there is no redundant level.wallmarks