Polyphase Game Engine
Loading...
Searching...
No Matches
Terrain3d.h
Go to the documentation of this file.
1#pragma once
2
3#include "Nodes/3D/Mesh3d.h"
4#include "Vertex.h"
5#include <vector>
6
7class btTriangleIndexVertexArray;
8class btBvhTriangleMeshShape;
9struct btTriangleInfoMap;
10class Texture;
11
13{
14public:
16
17 Terrain3D();
18 ~Terrain3D();
19
20 // Grid configuration
21 int32_t mResolutionX = 128; // vertices along X axis
22 int32_t mResolutionZ = 128; // vertices along Z axis
23 float mWorldWidth = 128.0f; // world-space extent X
24 float mWorldDepth = 128.0f; // world-space extent Z
25 float mHeightScale = 10.0f; // multiplier for height values
26
27 // Heightmap data (row-major, resX * resZ floats)
28 std::vector<float> mHeightmap;
29
30 // Splatmap: 4 material weights per vertex, packed RGBA uint32
31 std::vector<uint32_t> mSplatmap;
32
33 // Material slots (up to 4, MaterialLite only for Wii/3DS compat)
34 static constexpr int32_t MAX_MATERIAL_SLOTS = 4;
35 MaterialRef mMaterialSlots[MAX_MATERIAL_SLOTS];
36 bool mUseMaterialSlots = false; // When false, vertex color is white (no splatmap tinting)
37
38 // Atlas texturing (same approach as Voxel3D)
40 bool mEnableAtlasTexturing = false;
41 uint32_t mAtlasTilesX = 4; // atlas grid columns
42 uint32_t mAtlasTilesY = 4; // atlas grid rows
43 int32_t mSlotAtlasTile[MAX_MATERIAL_SLOTS] = {0, 1, 2, 3}; // tile index per slot
44 float mTextureTiling = 32.0f; // UV repetitions across the terrain
45 glm::vec4 mSlotTintColor[MAX_MATERIAL_SLOTS] = {
46 glm::vec4(1.0f), glm::vec4(1.0f), glm::vec4(1.0f), glm::vec4(1.0f)
47 };
48
49 // Baked splatmap: blends atlas tiles per-pixel for smooth material transitions
50 bool mBakeSplatmap = false; // When true, generates a blended texture
51 uint32_t mBakeResolution = 512; // Baked texture resolution (NxN)
52 bool mDebugSplatmap = false; // When true, renders raw splatmap weights as vertex color
53 TextureRef mBakedMapTexture; // Saved baked map asset (persists across PIE/runtime)
54
55 // Auto-generation rules per material slot
56 struct SlotRule
57 {
58 float mHeightMin = 0.0f; // Normalized height [0,1] where this slot starts
59 float mHeightMax = 1.0f; // Normalized height [0,1] where this slot ends
60 float mSlopeMin = 0.0f; // Min slope angle in degrees (0=flat)
61 float mSlopeMax = 90.0f; // Max slope angle in degrees (90=vertical)
62 float mBlend = 0.1f; // Blend falloff at rule edges [0,1]
63 float mStrength = 1.0f; // Overall weight multiplier
64 };
65 SlotRule mSlotRules[MAX_MATERIAL_SLOTS];
66
67 void GenerateSplatmapFromRules();
68
69 // Snapping
70 float mSnapGridSize = 0.0f; // 0 = no snapping
71
72 // Heightmap import texture reference
74
75 // Lifecycle overrides
76 virtual const char* GetTypeName() const override;
77 virtual void GatherProperties(std::vector<Property>& outProps) override;
78 virtual void Create() override;
79 virtual void Destroy() override;
80 virtual void Copy(Node* srcNode, bool recurse) override;
81 Terrain3DResource* GetResource();
82 virtual void Tick(float deltaTime) override;
83 virtual void EditorTick(float deltaTime) override;
84 virtual void SaveStream(Stream& stream, Platform platform) override;
85 virtual void LoadStream(Stream& stream, Platform platform, uint32_t version) override;
86 virtual bool IsStaticMesh3D() const override;
87 virtual bool IsSkeletalMesh3D() const override;
88 virtual Material* GetMaterial() override;
89 virtual void Render() override;
90 virtual Bounds GetLocalBounds() const override;
91
92 // Heightmap API
93 void SetHeight(int32_t x, int32_t z, float height);
94 float GetHeight(int32_t x, int32_t z) const;
95 float GetHeightAtWorldPos(float worldX, float worldZ) const;
96 void SetHeightFromTexture(Texture* texture);
97 void FlattenAll(float height = 0.0f);
98 void Resize(int32_t resX, int32_t resZ, float worldW, float worldD);
99
100 // Splatmap/Material API
101 void SetMaterialWeight(int32_t x, int32_t z, int32_t slot, float weight);
102 float GetMaterialWeight(int32_t x, int32_t z, int32_t slot) const;
103 void SetMaterialSlot(int32_t slot, Material* mat);
104 Material* GetMaterialSlot(int32_t slot) const;
105
106 // Baked splatmap
107 void BakeSplatmapTexture();
108 void BakeAndSaveMap(const std::string& savePath = "");
109 void BakeAndSaveHeightmap(const std::string& savePath = "");
110
111 // Mesh control
112 void MarkDirty();
113 void RebuildMesh();
114 bool IsDirty() const { return mMeshDirty; }
115 uint32_t GetNumVertices() const { return mNumVertices; }
116 uint32_t GetNumIndices() const { return mNumIndices; }
117 const std::vector<VertexColor>& GetVertices() const { return mVertices; }
118 const std::vector<IndexType>& GetIndices() const { return mIndices; }
119 int32_t GetResolutionX() const { return mResolutionX; }
120 int32_t GetResolutionZ() const { return mResolutionZ; }
121 float GetWorldWidth() const { return mWorldWidth; }
122 float GetWorldDepth() const { return mWorldDepth; }
123
124protected:
125
126 static bool HandlePropChange(Datum* datum, uint32_t index, const void* newValue);
127
128 void TickCommon(float deltaTime);
129 void InitHeightmap();
130 void RebuildMeshInternal();
131 void UploadMeshData();
132 void UpdateBounds();
133 void RecreateCollisionShape();
134 void DestroyTriangleCollisionData();
135
136 // Generated mesh data (CPU side)
137 std::vector<VertexColor> mVertices;
138 std::vector<IndexType> mIndices;
139 uint32_t mNumVertices = 0;
140 uint32_t mNumIndices = 0;
141
142 // Dirty tracking
143 bool mMeshDirty = true;
144 bool mUploadDirty[MAX_FRAMES] = {};
145
146 // Bounds cache
148
149 // GPU resource
151
152 // Default material
154
155 // Baked splatmap texture (runtime-generated)
156 Texture* mBakedTexture = nullptr;
157
158 // Triangle collision data
159 std::vector<glm::vec3> mCollisionVertices;
160 std::vector<int32_t> mCollisionIndices;
161 btTriangleIndexVertexArray* mTriangleIndexVertexArray = nullptr;
162 btTriangleInfoMap* mTriangleInfoMap = nullptr;
163};
Platform
Definition EngineTypes.h:31
#define POLYPHASE_API
Definition PolyphaseAPI.h:31
Definition AssetRef.h:18
Definition Datum.h:164
Definition Material.h:48
Definition Mesh3d.h:13
static bool HandlePropChange(Datum *datum, uint32_t index, const void *newValue)
Definition Mesh3d.cpp:12
virtual bool IsSkeletalMesh3D() const
Definition Mesh3d.cpp:132
virtual const char * GetTypeName() const override
Definition Mesh3d.cpp:39
virtual Material * GetMaterial()=0
virtual bool IsStaticMesh3D() const
Definition Mesh3d.cpp:127
virtual void GatherProperties(std::vector< Property > &outProps) override
Definition Mesh3d.cpp:44
virtual void LoadStream(Stream &stream, Platform platform, uint32_t version) override
Definition Mesh3d.cpp:77
virtual void SaveStream(Stream &stream, Platform platform) override
Definition Mesh3d.cpp:56
Definition Node.h:67
void TickCommon(float deltaTime)
Definition Node.cpp:573
virtual void EditorTick(float deltaTime)
Definition Node.cpp:563
virtual void Copy(Node *srcNode, bool recurse)
Definition Node.cpp:323
virtual void Destroy() override
Definition Primitive3d.cpp:129
virtual Bounds GetLocalBounds() const
Definition Primitive3d.cpp:829
virtual void Tick(float deltaTime) override
Definition Primitive3d.cpp:163
virtual void Render() override
Definition Primitive3d.cpp:259
virtual void Create() override
Definition Primitive3d.cpp:117
Definition Stream.h:21
Definition Terrain3d.h:13
int32_t GetResolutionX() const
Definition Terrain3d.h:119
std::vector< IndexType > mIndices
Definition Terrain3d.h:138
TextureRef mHeightmapTexture
Definition Terrain3d.h:73
std::vector< int32_t > mCollisionIndices
Definition Terrain3d.h:160
std::vector< VertexColor > mVertices
Definition Terrain3d.h:137
TextureRef mAtlasTexture
Definition Terrain3d.h:39
const std::vector< IndexType > & GetIndices() const
Definition Terrain3d.h:118
Terrain3DResource mResource
Definition Terrain3d.h:150
float GetWorldWidth() const
Definition Terrain3d.h:121
Bounds mBounds
Definition Terrain3d.h:147
DECLARE_NODE(Terrain3D, Mesh3D)
bool IsDirty() const
Definition Terrain3d.h:114
std::vector< uint32_t > mSplatmap
Definition Terrain3d.h:31
std::vector< float > mHeightmap
Definition Terrain3d.h:28
float GetWorldDepth() const
Definition Terrain3d.h:122
const std::vector< VertexColor > & GetVertices() const
Definition Terrain3d.h:117
std::vector< glm::vec3 > mCollisionVertices
Definition Terrain3d.h:159
int32_t GetResolutionZ() const
Definition Terrain3d.h:120
uint32_t GetNumIndices() const
Definition Terrain3d.h:116
MaterialRef mDefaultMaterial
Definition Terrain3d.h:153
uint32_t GetNumVertices() const
Definition Terrain3d.h:115
TextureRef mBakedMapTexture
Definition Terrain3d.h:53
Definition Texture.h:10
Definition EngineTypes.h:193
Definition GraphicsTypes.h:242
Definition Terrain3d.h:57