12 mSizeOfVerticesBytes(0),
13 mSizeOfIndicesBytes(0),
21 mSizeOfVerticesBytes(0),
22 mSizeOfIndicesBytes(0),
32 mSizeOfVerticesBytes(0),
33 mSizeOfIndicesBytes(0),
52 if (mGpuHandle->IsOnGPU())
58 mGpuHandle = std::unique_ptr<IMeshRenderResources>(mRenderer->ProvideMeshRenderResources());
69 mGpuHandle->CreateIndexBuffer(mIndices);
75 mGpuHandle->CreateIndexBuffer(mIndices);
81 mGpuHandle->CreateIndexBuffer(mIndices);
98 mGpuHandle->Shutdown();
100 mGpuHandle =
nullptr;
109 result = mGpuHandle->IsOnGPU();
117 std::unique_ptr<Model> model = std::make_unique<Model>(path,
true);
121 if (model->HasMeshes())
123 mPositions = model->Meshes()[0]->Vertices();
125 if (model->Meshes()[0]->VertexColors().size() >= 1)
126 mColor = model->Meshes()[0]->VertexColors()[0];
128 mNormals = model->Meshes()[0]->Normals();
129 for (
const auto& texCoord : model->Meshes()[0]->TextureCoordinates()[0])
131 mTexCoords.push_back(glm::vec2(texCoord.x, texCoord.y));
133 mTangents = model->Meshes()[0]->Tangents();
134 mIndices = model->Meshes()[0]->Indices();
145 std::unique_ptr<Model> model = std::make_unique<Model>(fileBytes,
true);
149 if (model->HasMeshes())
151 mPositions = model->Meshes()[0]->Vertices();
153 if (model->Meshes()[0]->VertexColors().size() >= 1)
154 mColor = model->Meshes()[0]->VertexColors()[0];
156 mNormals = model->Meshes()[0]->Normals();
157 for (
const auto& texCoord : model->Meshes()[0]->TextureCoordinates()[0])
159 mTexCoords.push_back(glm::vec2(texCoord.x, texCoord.y));
161 mTangents = model->Meshes()[0]->Tangents();
162 mIndices = model->Meshes()[0]->Indices();
173 mPositions2D = { {-0.5f, -0.5f}, { 0.5f, -0.5f}, { 0.5f, 0.5f}, {-0.5f, 0.5f} };
174 mTexCoords = { {0.0f, 1.0f}, {1.0f, 1.0f}, {1.0f, 0.0f}, {0.0f, 0.0f} };
175 mColor = { {1.0f, 0.0f, 0.0f, 1.0f}, {0.0f, 1.0f, 0.0f, 1.0f}, {0.0f, 0.0f, 1.0f, 1.0f}, {1.0f, 1.0f, 1.0f, 1.0f} };
192 result = mGpuHandle->GetVertexBufferSize();
204 result = mGpuHandle->GetIndexBufferSize();
212 return mSizeOfVerticesBytes;
217 return mSizeOfIndicesBytes;
226 return mGpuHandle.get();
231 size_t sizeOfVerticesBytes = 0;
232 size_t sizeOfIndicesBytes = 0;
234 sizeOfVerticesBytes += (mPositions2D.size() *
sizeof(glm::vec2));
235 sizeOfVerticesBytes += (mPositions.size() *
sizeof(glm::vec3));
236 sizeOfVerticesBytes += (mColor.size() *
sizeof(glm::vec4));
237 sizeOfVerticesBytes += (mNormals.size() *
sizeof(glm::vec3));
238 sizeOfVerticesBytes += (mTexCoords.size() *
sizeof(glm::vec2));
239 sizeOfVerticesBytes += (mTangents.size() *
sizeof(glm::vec3));
241 sizeOfIndicesBytes += (mIndices.size() *
sizeof(uint32_t));
243 mSizeOfVerticesBytes = sizeOfVerticesBytes;
244 mSizeOfIndicesBytes = sizeOfIndicesBytes;
249 std::vector<Vertex2D> result;
251 unsigned int index = 0;
252 for (
const auto& position : mPositions2D)
256 vert.
color = mColor.empty() ? glm::vec4(1.0f) : mColor[index];
259 result.push_back(vert);
268 std::vector<VertexPositionColorTexture> result;
270 unsigned int index = 0;
271 for (
const auto& position : mPositions)
275 vert.
color = mColor.empty() ? glm::vec4(1) : mColor[index];
278 result.push_back(vert);
287 std::vector<VertexPositionColorTextureNormalTangent> result;
289 unsigned int index = 0;
290 for (
const auto& position : mPositions)
294 vert.
color = mColor.empty() ? glm::vec4(1.0f) : mColor[index];
296 vert.
normal = mNormals.empty() ? glm::vec3(0.0f, 0.0f, 1.0f) : mNormals[index];
297 vert.
tangent = mTangents.empty() ? glm::vec3(1.0f, 0.0f, 0.0f) : mTangents[index];
299 result.push_back(vert);
Interface for GPU mesh resource management.
Defines an abstract interface for rendering backends.
size_t GetCpuIndexBufferSize() const
Get the size (in bytes) of the index buffer in RAM.
void CreateQuad2D()
Creates a 1�1 unit quad centered at the origin.
std::vector< VertexPositionColorTextureNormalTangent > ComposeLitBuffer()
Compose a vertex buffer for lit 3D meshes (with normals, tangents).
void CalculateMeshParameters()
Calculate and cache sizes of RAM buffers for statistics or debugging.
void LoadModel(std::string path)
Load a model from file and extract mesh data to RAM.
size_t GetGpuIndexBufferSize() const
Get the size (in bytes) of the index buffer on GPU.
std::vector< Vertex2D > ComposeVertex2DBuffer()
Compose a vertex buffer for 2D meshes (e.g., sprites).
IMeshRenderResources * GetMeshRenderResources()
Get the interface for mesh GPU resources (Vulkan or other backend).
void UploadToGPU()
Upload mesh data to the GPU using the current mesh type.
bool IsOnGPU() const
Check if mesh data is currently uploaded to GPU.
std::vector< VertexPositionColorTexture > ComposeUnlitBuffer()
Compose a vertex buffer for unlit 3D meshes (e.g., billboards, particles).
MeshDataGpu(IRenderer *renderer)
Constructs an empty MeshDataGpu object.
size_t GetCpuVertexBufferSize() const
Get the size (in bytes) of the vertex buffer in RAM.
~MeshDataGpu()
Destructor. Releases GPU resources if allocated.
size_t GetGpuVertexBufferSize() const
Get the size (in bytes) of the vertex buffer on GPU.
void ReleaseFromGPU()
Release GPU resources associated with this mesh.
MeshType
Types of supported mesh layouts for GPU upload and rendering.
@ Sprite2D
2D sprite mesh (typically for UI or simple quads).
@ None
Undefined or not yet set.
@ Surface
Full 3D surface mesh (models with normals/tangents, etc.).
@ Billboard
3D billboard mesh (sprites that face the camera).
Vertex format for 2D UI/Overlay elements.
glm::vec4 color
Vertex color (RGBA)
glm::vec2 position
2D position in screen or world space
glm::vec2 textureCoordinates
UV coordinates for texturing.
Vertex format for unlit 3D geometry.
glm::vec3 position
3D position
glm::vec4 color
Vertex color (RGBA)
glm::vec2 textureCoordinates
UV coordinates for texturing.
Vertex format for lit 3D geometry (normal and tangent support).
glm::vec3 tangent
Tangent (for normal mapping)
glm::vec4 color
Vertex color (RGBA)
glm::vec2 textureCoordinates
UV coordinates for texturing.
glm::vec3 position
3D position
glm::vec3 normal
Surface normal (for lighting)