| 2048 | } |
| 2049 | |
| 2050 | void RenderWorld::MeshManager::create_instances(const void *components_data |
| 2051 | , u32 num |
| 2052 | , const UnitId *unit_lookup |
| 2053 | , const u32 *unit_index |
| 2054 | ) |
| 2055 | { |
| 2056 | const MeshRendererDesc *meshes = (MeshRendererDesc *)components_data; |
| 2057 | |
| 2058 | for (u32 i = 0; i < num; ++i) { |
| 2059 | UnitId unit = unit_lookup[unit_index[i]]; |
| 2060 | CE_ASSERT(!hash_map::has(_map, unit), "Unit already has a mesh component"); |
| 2061 | |
| 2062 | TransformId ti = _render_world->_scene_graph->instance(unit); |
| 2063 | CE_ASSERT(is_valid(ti), "Mesh Component requires a Transform Component"); |
| 2064 | |
| 2065 | if (_data.size == _data.capacity) |
| 2066 | grow(); |
| 2067 | |
| 2068 | const MeshResource *mr = (MeshResource *)_render_world->_resource_manager->get(RESOURCE_TYPE_MESH, meshes[i].mesh_resource); |
| 2069 | const MeshGeometry *mg = mr->geometry(meshes[i].geometry_name); |
| 2070 | const MaterialResource *mat_res = (MaterialResource *)_render_world->_resource_manager->get(RESOURCE_TYPE_MATERIAL, meshes[i].material_resource); |
| 2071 | |
| 2072 | _render_world->_material_manager->create_material(mat_res); |
| 2073 | |
| 2074 | const u32 last = _data.size; |
| 2075 | |
| 2076 | _data.unit[last] = unit; |
| 2077 | _data.resource[last] = mr; |
| 2078 | _data.geometry[last] = mg; |
| 2079 | _data.mesh[last].vbh = mg->vertex_buffer; |
| 2080 | _data.mesh[last].ibh = mg->index_buffer; |
| 2081 | _data.material[last] = _render_world->_material_manager->get(mat_res); |
| 2082 | _data.world[last] = _render_world->_scene_graph->world_pose(ti); |
| 2083 | _data.obb[last] = mg->obb; |
| 2084 | _data.sphere[last] = mg->sphere; |
| 2085 | _data.skeleton[last] = NULL; |
| 2086 | _data.flags[last] = meshes[i].flags | RenderableFlags::DIRTY; |
| 2087 | _data.prev_flags[last] = 0; |
| 2088 | #if CROWN_CAN_RELOAD |
| 2089 | _data.material_resource[last] = mat_res; |
| 2090 | _data.geometry_name[last] = meshes[i].geometry_name; |
| 2091 | #endif |
| 2092 | _dirty = true; |
| 2093 | |
| 2094 | hash_map::set(_map, unit, alloc_id(last)); |
| 2095 | ++_data.size; |
| 2096 | } |
| 2097 | } |
| 2098 | |
| 2099 | void RenderWorld::MeshManager::destroy(MeshId mesh) |
| 2100 | { |
no test coverage detected