diff --git a/planet/Objects.c4d/Items.c4d/Weapons.c4d/Musket.c4d/Scene.material b/planet/Objects.c4d/Items.c4d/Weapons.c4d/Musket.c4d/Scene.material index 4cb9dd69e..9bccd973c 100644 --- a/planet/Objects.c4d/Items.c4d/Weapons.c4d/Musket.c4d/Scene.material +++ b/planet/Objects.c4d/Items.c4d/Weapons.c4d/Musket.c4d/Scene.material @@ -31,7 +31,6 @@ material Musket diffuse 0.800000 0.800000 0.800000 1.000000 specular 0.000000 0.000000 0.000000 1.000000 12.500000 emissive 0.000000 0.000000 0.000000 1.000000 - scene_blend alpha_blend texture_unit { texture musket.png @@ -40,4 +39,4 @@ material Musket } } } -} \ No newline at end of file +} diff --git a/planet/Objects.c4d/Structures.c4d/Chest.c4d/Scene.material b/planet/Objects.c4d/Structures.c4d/Chest.c4d/Scene.material index a12673591..51a840cfd 100644 --- a/planet/Objects.c4d/Structures.c4d/Chest.c4d/Scene.material +++ b/planet/Objects.c4d/Structures.c4d/Chest.c4d/Scene.material @@ -30,7 +30,6 @@ material Chest diffuse 0.640000 0.640000 0.640000 1.000000 specular 0.500000 0.500000 0.500000 1.000000 12.500000 emissive 0.000000 0.000000 0.000000 1.000000 - scene_blend alpha_blend texture_unit { texture chest.png diff --git a/src/game/object/C4DefGraphics.cpp b/src/game/object/C4DefGraphics.cpp index 3bbcd7dca..e5408b0a1 100644 --- a/src/game/object/C4DefGraphics.cpp +++ b/src/game/object/C4DefGraphics.cpp @@ -178,8 +178,8 @@ bool C4DefGraphics::LoadMesh(C4Group &hGroup, StdMeshSkeletonLoader& loader) return false; delete[] buf; - // Create mirrored animations (#401) - Mesh->MirrorAnimations(); + // Create mirrored animations (#401), order submeshes + Mesh->PostInit(); } catch (const std::runtime_error& ex) { diff --git a/src/platform/StdMesh.cpp b/src/platform/StdMesh.cpp index cf7ace924..f54e46bae 100644 --- a/src/platform/StdMesh.cpp +++ b/src/platform/StdMesh.cpp @@ -30,6 +30,15 @@ std::vector* StdMeshInstanc namespace { + // Helper to sort submeshes so that opaque ones appear before non-opaque ones + struct StdMeshSubMeshVisibilityCmpPred + { + bool operator()(const StdSubMesh& first, const StdSubMesh& second) + { + return first.GetMaterial().IsOpaque() > second.GetMaterial().IsOpaque(); + } + }; + // Helper to sort faces for FaceOrdering struct StdMeshInstanceFaceOrderingCmpPred { @@ -989,7 +998,7 @@ void StdMesh::MirrorAnimation(const StdStrBuf& name, const StdMeshAnimation& ani } } -void StdMesh::MirrorAnimations() +void StdMesh::PostInit() { // Mirror .R and .L animations without counterpart for(std::map::iterator iter = Animations.begin(); iter != Animations.end(); ++iter) @@ -1005,6 +1014,9 @@ void StdMesh::MirrorAnimations() MirrorAnimation(buf, iter->second); } } + + // Order submeshes so that opaque submeshes come before non-opaque ones + std::sort(SubMeshes.begin(), SubMeshes.end(), StdMeshSubMeshVisibilityCmpPred()); } StdSubMeshInstance::StdSubMeshInstance(const StdSubMesh& submesh): @@ -1043,6 +1055,9 @@ void StdSubMeshInstance::SetMaterial(const StdMeshMaterial& material) PassData[i].TexUnits.push_back(unit); } } + + // TODO: Reorder this submesh so that opaque submeshes are drawn + // before non-opaque ones. } void StdMeshInstance::SerializableValueProvider::CompileFunc(StdCompiler* pComp) diff --git a/src/platform/StdMesh.h b/src/platform/StdMesh.h index 40f211dfa..614600dd3 100644 --- a/src/platform/StdMesh.h +++ b/src/platform/StdMesh.h @@ -277,7 +277,7 @@ public: // TODO: This code should maybe better be placed in StdMeshLoader... void MirrorAnimation(const StdStrBuf& name, const StdMeshAnimation& animation); - void MirrorAnimations(); + void PostInit(); private: void AddMasterBone(StdMeshBone* bone);