From 3fcaa22d1020cf0f39dbb71967bfe195e36a0209 Mon Sep 17 00:00:00 2001 From: titiger Date: Mon, 5 Apr 2021 23:32:17 +0200 Subject: [PATCH] fixed double-sided switch and only-selectable doublesided switch in blender 2.9x did not work before, it was always rendered single sided in MG. I added a new switch only-selectable which allows to create unvisible but selectable meshes. This helps with selection of small units which can now have an unvisible hand craftet select object around them for example.. --- source/glest_game/graphics/renderer.cpp | 2 +- source/shared_lib/include/graphics/model.h | 2 ++ .../include/graphics/model_header.h | 3 ++- .../include/graphics/model_renderer.h | 1 + .../sources/graphics/gl/model_renderer_gl.cpp | 5 +++++ source/shared_lib/sources/graphics/model.cpp | 8 +++++++ source/tools/glexemel/g3d_support_b290.py | 22 ++++++++++++------- 7 files changed, 33 insertions(+), 10 deletions(-) diff --git a/source/glest_game/graphics/renderer.cpp b/source/glest_game/graphics/renderer.cpp index 637ab9ba..4b399d7e 100644 --- a/source/glest_game/graphics/renderer.cpp +++ b/source/glest_game/graphics/renderer.cpp @@ -7896,7 +7896,7 @@ vector Renderer::renderUnitsFast(bool renderingShadows, bool colorPickin unitsList.push_back(unit); } - modelRenderer->render(model,rmSelection); + modelRenderer->render(model,renderingShadows?rmShadows:rmSelection); glPopMatrix(); diff --git a/source/shared_lib/include/graphics/model.h b/source/shared_lib/include/graphics/model.h index eee2ff3a..e81cc1d3 100644 --- a/source/shared_lib/include/graphics/model.h +++ b/source/shared_lib/include/graphics/model.h @@ -74,6 +74,7 @@ private: bool customColor; bool noSelect; bool glow; + bool onlySelect; uint32 textureFlags; @@ -136,6 +137,7 @@ public: bool getCustomTexture() const {return customColor;} bool getNoSelect() const {return noSelect;} bool getGlow() const {return glow;} + bool getOnlySelect() const {return onlySelect;} string getName() const {return name;} uint32 getTextureFlags() const { return textureFlags; } diff --git a/source/shared_lib/include/graphics/model_header.h b/source/shared_lib/include/graphics/model_header.h index efe277a1..6eea67ee 100644 --- a/source/shared_lib/include/graphics/model_header.h +++ b/source/shared_lib/include/graphics/model_header.h @@ -44,7 +44,8 @@ enum MeshPropertyFlag{ mpfCustomColor= 1, mpfTwoSided= 2, mpfNoSelect= 4, - mpfGlow= 8 + mpfGlow= 8, + mpfOnlySelect= 16 }; enum MeshTexture{ diff --git a/source/shared_lib/include/graphics/model_renderer.h b/source/shared_lib/include/graphics/model_renderer.h index 58e7aade..03a0c0c4 100644 --- a/source/shared_lib/include/graphics/model_renderer.h +++ b/source/shared_lib/include/graphics/model_renderer.h @@ -21,6 +21,7 @@ namespace Shared{ namespace Graphics{ enum RenderMode{ rmNormal, rmSelection, + rmShadows, renderModeCount }; diff --git a/source/shared_lib/sources/graphics/gl/model_renderer_gl.cpp b/source/shared_lib/sources/graphics/gl/model_renderer_gl.cpp index e1bf5224..1ac32811 100644 --- a/source/shared_lib/sources/graphics/gl/model_renderer_gl.cpp +++ b/source/shared_lib/sources/graphics/gl/model_renderer_gl.cpp @@ -163,6 +163,11 @@ void ModelRendererGl::renderMesh(Mesh *mesh,int renderMode) { {// don't render this and do nothing return; } + if(renderMode!=rmSelection){ + if(mesh->getOnlySelect()) { + return; + } + } //assertions assertGl(); diff --git a/source/shared_lib/sources/graphics/model.cpp b/source/shared_lib/sources/graphics/model.cpp index ddfe68f5..4c389ad2 100644 --- a/source/shared_lib/sources/graphics/model.cpp +++ b/source/shared_lib/sources/graphics/model.cpp @@ -226,6 +226,7 @@ Mesh::Mesh() { customColor= false; noSelect= false; glow= false; + onlySelect=false; textureFlags=0; @@ -448,6 +449,7 @@ void Mesh::loadV2(int meshIndex, const string &dir, FILE *f, TextureManager *tex customColor= false; noSelect= false; glow= false; + onlySelect= false; if(SystemFlags::VERBOSE_MODE_ENABLED) printf("Load v2, this = %p Found meshHeader.hasTexture = %d, texName [%s] mtDiffuse = %d meshIndex = %d modelFile [%s]\n",this,meshHeader.hasTexture,toLower(reinterpret_cast(meshHeader.texName)).c_str(),mtDiffuse,meshIndex,modelFile.c_str()); @@ -589,6 +591,7 @@ void Mesh::loadV3(int meshIndex, const string &dir, FILE *f, customColor= (meshHeader.properties & mp3CustomColor) != 0; noSelect = false; glow = false; + onlySelect=false; textureFlags= 0; if((meshHeader.properties & mp3NoTexture) != mp3NoTexture) { @@ -785,6 +788,7 @@ void Mesh::load(int meshIndex, const string &dir, FILE *f, TextureManager *textu twoSided= (meshHeader.properties & mpfTwoSided) != 0; noSelect= (meshHeader.properties & mpfNoSelect) != 0; glow= (meshHeader.properties & mpfGlow) != 0; + onlySelect= (meshHeader.properties & mpfOnlySelect) != 0; //material diffuseColor= Vec3f(meshHeader.diffuseColor); @@ -916,6 +920,9 @@ void Mesh::save(int meshIndex, const string &dir, FILE *f, TextureManager *textu if(glow) { meshHeader.properties |= mpfGlow; } + if(onlySelect){ + meshHeader.properties|= mpfOnlySelect; + } meshHeader.textures = textureFlags; fwrite(&meshHeader, sizeof(MeshHeader), 1, f); @@ -1550,6 +1557,7 @@ void Mesh::copyInto(Mesh *dest, bool ignoreInterpolationData, dest->customColor = this->customColor; dest->noSelect = this->noSelect; dest->glow = this->glow; + dest->onlySelect = this->onlySelect; dest->textureFlags = this->textureFlags; diff --git a/source/tools/glexemel/g3d_support_b290.py b/source/tools/glexemel/g3d_support_b290.py index ec8ea076..5e144491 100644 --- a/source/tools/glexemel/g3d_support_b290.py +++ b/source/tools/glexemel/g3d_support_b290.py @@ -255,6 +255,7 @@ class G3DMeshHeaderv4: # Read Meshheader self.istwosided = bool(self.properties & 2) self.noselect = bool(self.properties & 4) self.glow = bool(self.properties & 8) + self.onlySelect = bool(self.properties & 16) self.hastexture = False self.diffusetexture = None @@ -432,14 +433,15 @@ def createMesh(filename, header, data, toblender, operator): mesh.polygons.foreach_set( "use_smooth", (True,)*len(mesh.polygons.data.polygons)) mesh.g3d_customColor = header.customalpha - # mesh.show_double_sided = header.istwosided + mesh.show_double_sided = header.istwosided if header.isv4: mesh.g3d_noSelect = header.noselect mesh.g3d_glow = header.glow + mesh.g3d_onlySelect = header.onlySelect else: mesh.g3d_noSelect = False mesh.glow = False - mesh.g3d_fullyOpaque = False + #mesh.g3d_onlySelect = False # =================================================================================================== # Material Setup @@ -895,11 +897,15 @@ def G3DSaver(filepath, context, toglest, operator): properties |= 2 except Exception as e: print("No material, backface culling not set: ", e) - + + if mesh.show_double_sided: + properties |= 2 if mesh.g3d_noSelect: properties |= 4 if mesh.g3d_glow: properties |= 8 + if mesh.g3d_onlySelect: + properties |= 16 #MeshData vertices = [] @@ -932,7 +938,7 @@ def G3DSaver(filepath, context, toglest, operator): context.scene.frame_set(fcurrent) - if mesh.g3d_fullyOpaque: + if mesh.g3d_onlySelect: opacity = 1.0 # MeshHeader @@ -987,7 +993,7 @@ class G3DPanel(bpy.types.Panel): "show_double_sided", text="double sided") self.layout.prop(context.object.data, "g3d_noSelect") - self.layout.prop(context.object.data, "g3d_fullyOpaque") + self.layout.prop(context.object.data, "g3d_onlySelect") self.layout.prop(context.object.data, "g3d_glow") @@ -1094,9 +1100,9 @@ def register(): description="replace alpha channel of texture with team color") bpy.types.Mesh.g3d_noSelect = bpy.props.BoolProperty( name="non-selectable", description="click on mesh doesn't select unit") - bpy.types.Mesh.g3d_fullyOpaque = bpy.props.BoolProperty( - name="fully opaque", - description="sets opacity to 1.0, ignoring what's set in materials") + bpy.types.Mesh.g3d_onlySelect = bpy.props.BoolProperty( + name="only-selectable", + description="this mesh is not visible, only selectable") bpy.types.Mesh.g3d_glow = bpy.props.BoolProperty( name="glow", description="let objects glow like particles") bpy.types.Mesh.show_double_sided = bpy.props.BoolProperty(