| 99 | } |
| 100 | |
| 101 | Material *MaterialManager::create_material(const MaterialResource *resource) |
| 102 | { |
| 103 | Material *material = hash_map::get(_materials, resource, (Material *)NULL); |
| 104 | if (material != NULL) |
| 105 | return material; |
| 106 | |
| 107 | const u32 size = sizeof(Material) + resource->dynamic_data_size; |
| 108 | material = (Material *)_allocator->allocate(size); |
| 109 | new (material) Material(*_allocator); |
| 110 | material->_resource_manager = _resource_manager; |
| 111 | material->_resource = resource; |
| 112 | material->_data = (char *)&material[1]; |
| 113 | material->_shader = _shader_manager->shader(resource->shader); |
| 114 | |
| 115 | const char *dynamic_data = (char *)resource + resource->dynamic_data_offset; |
| 116 | memcpy(material->_data, dynamic_data, resource->dynamic_data_size); |
| 117 | |
| 118 | #if CROWN_CAN_RELOAD |
| 119 | array::resize(material->_texture_resources, resource->num_textures); |
| 120 | #endif |
| 121 | |
| 122 | hash_map::set(_materials, resource, material); |
| 123 | return material; |
| 124 | } |
| 125 | |
| 126 | Material *MaterialManager::get(const MaterialResource *resource) |
| 127 | { |
no test coverage detected