| 979 | } |
| 980 | |
| 981 | void RenderWorld::update_transforms(const UnitId *begin, const UnitId *end, const Matrix4x4 *world) |
| 982 | { |
| 983 | MeshManager::MeshInstanceData &mid = _mesh_manager._data; |
| 984 | SpriteManager::SpriteInstanceData &sid = _sprite_manager._data; |
| 985 | LightManager::LightInstanceData &lid = _light_manager._data; |
| 986 | LodGroupManager::LodGroupInstanceData &lgd = _lod_group_manager._data; |
| 987 | |
| 988 | for (; begin != end; ++begin, ++world) { |
| 989 | if (_mesh_manager.has(*begin)) { |
| 990 | MeshId mesh = _mesh_manager.mesh(*begin); |
| 991 | const u32 mesh_i = _mesh_manager.index(mesh); |
| 992 | mid.world[mesh_i] = *world; |
| 993 | |
| 994 | _mesh_manager._data.flags[mesh_i] |= RenderableFlags::DIRTY; |
| 995 | _mesh_manager._dirty = true; |
| 996 | } |
| 997 | |
| 998 | if (_sprite_manager.has(*begin)) { |
| 999 | SpriteId sprite = _sprite_manager.sprite(*begin); |
| 1000 | sid.world[sprite.i] = *world; |
| 1001 | |
| 1002 | _sprite_manager._data.flags[sprite.i] |= RenderableFlags::DIRTY; |
| 1003 | _sprite_manager._dirty = true; |
| 1004 | } |
| 1005 | |
| 1006 | if (_lod_group_manager.has(*begin)) { |
| 1007 | LodGroupId lod_group = _lod_group_manager.lod_group(*begin); |
| 1008 | lgd.world[lod_group.i] = *world; |
| 1009 | |
| 1010 | culling_set::update(_cullable_objects |
| 1011 | , CullableType::LOD_GROUP |
| 1012 | , lod_group.i |
| 1013 | , lgd.sphere[lod_group.i] |
| 1014 | , lgd.world[lod_group.i] |
| 1015 | ); |
| 1016 | } |
| 1017 | |
| 1018 | if (_light_manager.has(*begin)) { |
| 1019 | LightId light = _light_manager.light(*begin); |
| 1020 | |
| 1021 | Vector3 pos = translation(*world); |
| 1022 | Vector3 dir = -z(*world); |
| 1023 | normalize(dir); |
| 1024 | |
| 1025 | lid.shader[light.i].position = pos; |
| 1026 | lid.shader[light.i].direction = dir; |
| 1027 | |
| 1028 | _light_manager._dirty = true; |
| 1029 | } |
| 1030 | } |
| 1031 | } |
| 1032 | |
| 1033 | // From BGFX's 16-shadowmaps example. |
| 1034 | static void mtxYawPitchRoll(f32 *_result |