void Model::create(const bgfx::VertexDecl& def, Material* material, const int* indices_data, int indices_size, const void* attributes_data, int attributes_size) { m_geometry_buffer_object.setAttributesData( attributes_data, attributes_size, def); m_geometry_buffer_object.setIndicesData(indices_data, indices_size); m_meshes.emplace(def, material, 0, attributes_size, 0, indices_size / sizeof(int), "default", m_allocator); Model::LOD lod; lod.m_distance = FLT_MAX; lod.m_from_mesh = 0; lod.m_to_mesh = 0; m_lods.push(lod); m_indices.resize(indices_size / sizeof(m_indices[0])); memcpy(&m_indices[0], indices_data, indices_size); m_vertices.resize(attributes_size / def.getStride()); computeRuntimeData((const uint8_t*)attributes_data); onReady(); }
void Model::create(const bgfx::VertexDecl& def, Material* material, const int* indices_data, int indices_size, const void* attributes_data, int attributes_size) { ASSERT(!bgfx::isValid(m_vertices_handle)); m_vertices_handle = bgfx::createVertexBuffer(bgfx::copy(attributes_data, attributes_size), def); m_vertices_size = attributes_size; ASSERT(!bgfx::isValid(m_indices_handle)); auto* mem = bgfx::copy(indices_data, indices_size); m_indices_handle = bgfx::createIndexBuffer(mem, BGFX_BUFFER_INDEX32); m_indices_size = indices_size; m_meshes.emplace(def, material, 0, attributes_size, 0, indices_size / int(sizeof(int)), "default", m_allocator); Model::LOD lod; lod.m_distance = FLT_MAX; lod.m_from_mesh = 0; lod.m_to_mesh = 0; m_lods.push(lod); m_indices.resize(indices_size / sizeof(m_indices[0])); copyMemory(&m_indices[0], indices_data, indices_size); m_vertices.resize(attributes_size / def.getStride()); computeRuntimeData((const uint8*)attributes_data); onCreated(State::READY); }
bool Model::parseGeometry(FS::IFile& file) { int32_t indices_count = 0; file.read(&indices_count, sizeof(indices_count)); if (indices_count <= 0) { return false; } m_indices.resize(indices_count); file.read(&m_indices[0], sizeof(m_indices[0]) * indices_count); int32_t vertices_size = 0; file.read(&vertices_size, sizeof(vertices_size)); if (vertices_size <= 0) { return false; } Array<uint8_t> vertices(m_allocator); vertices.resize(vertices_size); file.read(&vertices[0], sizeof(vertices[0]) * vertices.size()); m_geometry_buffer_object.setAttributesData( &vertices[0], vertices.size(), m_meshes[0].getVertexDefinition()); m_geometry_buffer_object.setIndicesData( &m_indices[0], m_indices.size() * sizeof(m_indices[0])); int vertex_count = 0; for (int i = 0; i < m_meshes.size(); ++i) { vertex_count += m_meshes[i].getAttributeArraySize() / m_meshes[i].getVertexDefinition().getStride(); } m_vertices.resize(vertex_count); computeRuntimeData(&vertices[0]); return true; }
bool Model::parseGeometry(FS::IFile& file) { int32 indices_count = 0; file.read(&indices_count, sizeof(indices_count)); if (indices_count <= 0) return false; m_indices.resize(indices_count); file.read(&m_indices[0], sizeof(m_indices[0]) * indices_count); int32 vertices_size = 0; file.read(&vertices_size, sizeof(vertices_size)); if (vertices_size <= 0) return false; ASSERT(!bgfx::isValid(m_vertices_handle)); const bgfx::Memory* vertices_mem = bgfx::alloc(vertices_size); file.read(vertices_mem->data, vertices_size); m_vertices_handle = bgfx::createVertexBuffer(vertices_mem, m_meshes[0].getVertexDefinition()); m_vertices_size = vertices_size; ASSERT(!bgfx::isValid(m_indices_handle)); m_indices_size = sizeof(m_indices[0]) * indices_count; const bgfx::Memory* mem = bgfx::copy(&m_indices[0], m_indices_size); m_indices_handle = bgfx::createIndexBuffer(mem, BGFX_BUFFER_INDEX32); int vertex_count = 0; for (int i = 0; i < m_meshes.size(); ++i) { vertex_count += m_meshes[i].getAttributeArraySize() / m_meshes[i].getVertexDefinition().getStride(); } m_vertices.resize(vertex_count); computeRuntimeData(vertices_mem->data); return true; }