Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions trlevel/Level.h
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,9 @@ namespace trlevel
std::vector<tr2_entity> _entities;
std::unordered_map<uint32_t, tr_staticmesh> _static_meshes;
std::vector<tr4_ai_object> _ai_objects;
std::vector<tr4_animation> _animations;
std::vector<tr_state_change> _state_changes;
std::vector<tr_anim_dispatch> _anim_dispatches;

uint16_t _lara_type{ 0u };
uint16_t _weather_type{ 0u };
Expand Down
10 changes: 5 additions & 5 deletions trlevel/Level_tr1_pc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -468,8 +468,8 @@ namespace trlevel
uint32_t num_animations = read<uint32_t>(wad_file);
skip(wad_file, num_animations * 26);

read_state_changes(activity, wad_file, callbacks);
read_anim_dispatches(activity, wad_file, callbacks);
_state_changes = read_state_changes(activity, wad_file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, wad_file, callbacks);
read_anim_commands(activity, wad_file, callbacks);
_meshtree = read_meshtree(activity, wad_file, callbacks);
_frames = read_frames(activity, wad_file, callbacks);
Expand Down Expand Up @@ -685,9 +685,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
18 changes: 9 additions & 9 deletions trlevel/Level_tr1_psx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -305,9 +305,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down Expand Up @@ -434,9 +434,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down Expand Up @@ -484,11 +484,11 @@ namespace trlevel
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);

uint32_t num_animations = read<uint32_t>(file);
uint32_t num_animations = read<uint32_t>(file); // TODO: Read animations
skip(file, num_animations * 28);

read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
12 changes: 6 additions & 6 deletions trlevel/Level_tr2_pc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down Expand Up @@ -162,9 +162,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
24 changes: 12 additions & 12 deletions trlevel/Level_tr2_psx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -408,9 +408,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down Expand Up @@ -457,9 +457,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down Expand Up @@ -511,9 +511,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down Expand Up @@ -578,9 +578,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
6 changes: 3 additions & 3 deletions trlevel/Level_tr3_pc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
6 changes: 3 additions & 3 deletions trlevel/Level_tr3_psx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -262,9 +262,9 @@ namespace trlevel

_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr1_3(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = convert_animations(read_animations_tr1_3(activity, file, callbacks));
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
12 changes: 6 additions & 6 deletions trlevel/Level_tr4_pc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -119,9 +119,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, data_stream, callbacks);
_mesh_data = read_mesh_data(activity, data_stream, callbacks);
_mesh_pointers = read_mesh_pointers(activity, data_stream, callbacks);
read_animations_tr4_5(activity, data_stream, callbacks);
read_state_changes(activity, data_stream, callbacks);
read_anim_dispatches(activity, data_stream, callbacks);
_animations = read_animations_tr4_5(activity, data_stream, callbacks);
_state_changes = read_state_changes(activity, data_stream, callbacks);
_anim_dispatches = read_anim_dispatches(activity, data_stream, callbacks);
read_anim_commands(activity, data_stream, callbacks);
_meshtree = read_meshtree(activity, data_stream, callbacks);
_frames = read_frames(activity, data_stream, callbacks);
Expand Down Expand Up @@ -211,9 +211,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr4_5(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = read_animations_tr4_5(activity, file, callbacks);
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
4 changes: 2 additions & 2 deletions trlevel/Level_tr4_psx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -738,7 +738,7 @@ namespace trlevel

_mesh_data = read_mesh_data(activity, file, info, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, info, callbacks);
skip(file, info.animations_size);
skip(file, info.animations_size); // TODO: Load animations
skip(file, info.state_changes_size);
skip(file, info.dispatches_size);
skip(file, info.commands_size);
Expand Down Expand Up @@ -905,7 +905,7 @@ namespace trlevel
_mesh_data = read_mesh_data(activity, file, info, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, info, callbacks);

skip(file, info.animations_size);
skip(file, info.animations_size); // TODO: Read and store these
skip(file, info.state_changes_size);
skip(file, info.dispatches_size);
skip(file, info.commands_size);
Expand Down
6 changes: 3 additions & 3 deletions trlevel/Level_tr5_dc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -217,9 +217,9 @@ namespace trlevel
DreamcastPage page{ file };
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr4_5(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = read_animations_tr4_5(activity, file, callbacks);
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
12 changes: 6 additions & 6 deletions trlevel/Level_tr5_pc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -222,9 +222,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr4_5(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = read_animations_tr4_5(activity, file, callbacks);
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down Expand Up @@ -299,9 +299,9 @@ namespace trlevel
_floor_data = read_floor_data(activity, file, callbacks);
_mesh_data = read_mesh_data(activity, file, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, callbacks);
read_animations_tr4_5(activity, file, callbacks);
read_state_changes(activity, file, callbacks);
read_anim_dispatches(activity, file, callbacks);
_animations = read_animations_tr4_5(activity, file, callbacks);
_state_changes = read_state_changes(activity, file, callbacks);
_anim_dispatches = read_anim_dispatches(activity, file, callbacks);
read_anim_commands(activity, file, callbacks);
_meshtree = read_meshtree(activity, file, callbacks);
_frames = read_frames(activity, file, callbacks);
Expand Down
2 changes: 1 addition & 1 deletion trlevel/Level_tr5_psx.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ namespace trlevel

_mesh_data = read_mesh_data(activity, file, info, callbacks);
_mesh_pointers = read_mesh_pointers(activity, file, info, callbacks);
skip(file, info.animations_size);
skip(file, info.animations_size); // TODO: Load animations
skip(file, info.state_changes_size);
skip(file, info.dispatches_size);
skip(file, info.commands_size);
Expand Down
26 changes: 26 additions & 0 deletions trlevel/trtypes.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -201,4 +201,30 @@ namespace trlevel
};
}) | std::ranges::to<std::vector>();
}

std::vector<tr4_animation> convert_animations(std::vector<tr_animation> animations)
{
return animations | std::views::transform([](auto&& a) -> tr4_animation
{
return
{
.FrameOffset = a.FrameOffset,
.FrameRate = a.FrameRate,
.FrameSize = a.FrameSize,
.State_ID = a.State_ID,
.Speed = a.Speed,
.Accel = a.Accel,
.SpeedLateral = 0, // TODO: Is this correct?
.AccelLateral = 0, // TODO: Is this correct?
.FrameStart = a.FrameStart,
.FrameEnd = a.FrameEnd,
.NextAnimation = a.NextAnimation,
.NextFrame = a.NextFrame,
.NumStateChanges = a.NumStateChanges,
.StateChangeOffset = a.StateChangeOffset,
.NumAnimCommands = a.NumAnimCommands,
.AnimCommand = a.AnimCommand,
};
}) | std::ranges::to<std::vector>();
}
}
2 changes: 2 additions & 0 deletions trlevel/trtypes.h
Original file line number Diff line number Diff line change
Expand Up @@ -1003,6 +1003,8 @@ namespace trlevel

std::vector<tr4_mesh_face3> convert_tr3_psx_room_triangles(std::vector<uint32_t> triangles, uint16_t total_vertices);

std::vector<tr4_animation> convert_animations(std::vector<tr_animation> animations);

constexpr LightType convert(LightTypeTR3 type);
}

Expand Down
11 changes: 11 additions & 0 deletions trview.app/ApplicationCreate.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@
#include "Windows/TriggersWindow.h"
#include "Windows/Viewer.h"
#include "Windows/Log/LogWindow.h"
#include "Windows/Models/ModelsWindow.h"
#include "UI/DX11ImGuiBackend.h"
#include "Windows/Textures/TexturesWindow.h"
#include "Windows/CameraSink/CameraSinkWindow.h"
Expand Down Expand Up @@ -498,6 +499,15 @@ namespace trview
return pack_window;
};

auto transparency_buffer_source = [=](auto&& lts) { return std::make_unique<TransparencyBuffer>(device, lts); };

auto models_window_source = [=]()
{
auto models_window = std::make_shared<ModelsWindow>(device, render_target_source, shader_storage, buffer_source, transparency_buffer_source, sampler_source, std::make_unique<input::Mouse>(window, std::make_unique<input::WindowTester>(window)), messaging);
models_window->initialise();
return models_window;
};

auto windows = std::make_shared<Windows>(window, shortcuts);
windows->register_window("About", about_window_source);
windows->register_window("CameraSink", camera_sink_window_source);
Expand All @@ -506,6 +516,7 @@ namespace trview
windows->register_window("Items", items_window_source);
windows->register_window("Lights", lights_window_source);
windows->register_window("Log", log_window_source);
windows->register_window("Models", models_window_source);
windows->register_window("Pack", pack_window_source);
windows->register_window("Plugins", plugins_window_source);
windows->register_window("Rooms", rooms_window_source);
Expand Down
2 changes: 2 additions & 0 deletions trview.app/Elements/ILevel.h
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,8 @@ namespace trview
virtual std::string hash() const = 0;
virtual std::vector<std::weak_ptr<IFlyby>> flybys() const = 0;
virtual void update(float delta) = 0;
virtual std::weak_ptr<IModelStorage> model_storage() const = 0;
virtual std::weak_ptr<ILevelTextureStorage> level_texture_storage() const = 0;

// Event raised when the level needs to change the alternate mode.
Event<bool> on_alternate_mode_selected;
Expand Down
Loading