ISimpleMesh* CResourceFactory::createSimpleMesh( const std::string& name, u32 sortcode, u32 vertexFormat, void* vertices, void* indices, u32 vertexCount, u32 vertexStride, u32 indiceCount, const math::SAxisAlignedBox& aabb, bool bit32Index, E_MEMORY_USAGE usage) { IMeshBuffer* buffer = createMeshBuffer(usage, vertices, indices, vertexCount, indiceCount, vertexStride, bit32Index); if (!buffer) { GF_PRINT_CONSOLE_INFO("The mesh ('%s') create failed!. Due to the failure of mesh buffer.\n", name.c_str()); return nullptr; } CSimpleMesh* mesh = new CSimpleMesh(name, sortcode, aabb, vertexFormat, buffer); if (!mesh) { GF_PRINT_CONSOLE_INFO("The mesh ('%s') create failed!. Due to the lack of memory.\n", name.c_str()); buffer->drop(); return nullptr; } return mesh; }
RID MeshBufferParser::parse(JSONReader& reader, int childIndex) { MeshBufferDescriptor descriptor; reader.get(childIndex, "size", &descriptor.size); const char* indexBufferName = reader.get_string(childIndex, "index_buffer"); descriptor.indexBuffer = find(indexBufferName, ResourceType::INDEXBUFFER); const char* constantBufferName = reader.get_string(childIndex, "constant_buffer"); descriptor.constantBuffer = find(constantBufferName, ResourceType::CONSTANTBUFFER); const char* vertexBufferName = reader.get_string(childIndex, "vertex_buffer"); descriptor.vertexBuffer = find(vertexBufferName, ResourceType::VERTEXBUFFER); const char* materialName = reader.get_string(childIndex, "material"); descriptor.material = find(materialName, ResourceType::MATERIAL); const char* name = reader.get_string(childIndex, "name"); return createMeshBuffer(name, descriptor); }
IModelMesh* CResourceFactory::createModelMesh( const std::string& name, u32 sortcode, u32 vertexFormat, void* vertices, void* indices, u32 vertexCount, u32 vertexStride, u32 indiceCount, const math::SAxisAlignedBox& aabb, bool bit32Index, const std::vector<IModelMesh::SModelSubset>& subsets, E_MEMORY_USAGE usage) { IMeshBuffer* buffer = createMeshBuffer(usage, vertices, indices, vertexCount, indiceCount, vertexStride, bit32Index); if (!buffer) { GF_PRINT_CONSOLE_INFO("The mesh ('%s') create failed!. Due to the failure of mesh buffer.\n", name.c_str()); return nullptr; } if (subsets.size() < 1) { GF_PRINT_CONSOLE_INFO("FAIL:The mesh ('%s') create failed!. The subsets count must be greater than 1.\n", name.c_str()); return nullptr; } CModelMesh* mesh = new CModelMesh(name, sortcode, aabb, vertexFormat, subsets, buffer); if (!mesh) { GF_PRINT_CONSOLE_INFO("The mesh ('%s') create failed!. Due to the lack of memory.\n", name.c_str()); buffer->drop(); return nullptr; } return mesh; }
IBillboardCollectionMesh* CResourceFactory::createBillboardCollectionMesh( const std::string& name, u32 sortcode, const math::SAxisAlignedBox& aabb, bool alterable, u32 maxNum, const std::vector<SBillboard>& billboards) { IMeshBuffer* buffer = nullptr; if (alterable) { if (billboards.size() > maxNum) { GF_PRINT_CONSOLE_INFO("Billboard buffer creation failed." "billboards' number exceeds the maxNum.\n"); return nullptr; } void* vertices = nullptr; if (!billboards.empty()) vertices = (void*)&billboards[0]; buffer = createMeshBuffer(EMU_DYNAMIC, nullptr, nullptr, maxNum, 0, sizeof(SBillboard), true); buffer->setVertexData(vertices, billboards.size()); } else { // create a static buffer. // use the size of billboards as the maxNum. just ignore the 'maxNum' maxNum = billboards.size(); if (maxNum == 0) { GF_PRINT_CONSOLE_INFO("billboards cannot be empty when creating a " "billboard mesh"); return nullptr; } buffer = createMeshBuffer(EMU_STATIC, (void*)&billboards[0], nullptr, billboards.size(), 0, sizeof(SBillboard), true); } if (!buffer) { GF_PRINT_CONSOLE_INFO("The mesh ('%s') create failed!. Due to the failure of mesh buffer.\n", name.c_str()); return nullptr; } CBillboardCollectionMesh* mesh = new CBillboardCollectionMesh(name, sortcode, aabb, maxNum, alterable, billboards, buffer); if (!mesh) { GF_PRINT_CONSOLE_INFO("The mesh ('%s') create failed!. Due to the lack of memory.\n", name.c_str()); buffer->drop(); return nullptr; } return mesh; }