LunarViewer icon indicating copy to clipboard operation
LunarViewer copied to clipboard

A model viewer for Quake 1 and Hexen 2

LunarViewer

Windows (x64) Linux (x64)
A model viewer for Quake 1 and Hexen 2 with a focus on accurate representation.



Powered by raylib and dear imgui!

Features

  • Support for Quake 1 (IDPO) and Hexen 2 (RAPO) model formats
  • Hardware-accelerated with OpenGL, while still maintaining the software renderer look
  • Vertices are transformed and animated all on the GPU via a vertex shader
  • Supports previewing animations with interpolation

Known issues

  • Linux doesn't have a File Select Dialog yet. The model needs to be loaded via a launch argument (like LunarViewer ~/id1/progs/shambler.mdl). I'm planning on implementing one using ImGui that wouldn't require platform specific implementations and it would allow me to add model previews within that.
  • Sometimes when switching the render mode, the model's texture will get unloaded. Switching the render mode again a few times will fix it.
  • Models with animated textures (groupskins) are not supported yet
  • You can't change the skin that's being previewed
  • No config of any kind is saved (apart from imgui)
  • There's a slight offset on the UVs that I need to look into
  • The code is an absolute mess that needs to be cleaned up

Building

On Windows

Run premake-2019.bat to create a Visual Studio 2019 solution!

On Linux/Mac

Run premake-linux.sh to create the Makefiles and then run make to build! (You can do make config=release_x64 to make a release build)

Helpful resources used in the making of this project

Loading Quake 1 MDL files - http://tfc.duke.free.fr/coding/mdl-specs-en.html

Credits

  • Quake Mapping Discord (specifically Spoike and Paril) - help with the RAPO model format and flags
  • MissLav - testing on Linux with Wine
  • Joshua Barrett - help with getting the application working on Linux
  • Melanie Kat - the very cool icon

Used open source projects and libraries

raylib

https://github.com/raysan5/raylib/

Used as the rendering backend. The app also uses normal OpenGL code to do stuff that raylib itself doesn't expose.

The code was modified to ~~fix the normal matrix (it was in view space and not world space)~~ (It's fixed!) and to allow for the use of the stencil buffer.

ImGui

https://github.com/ocornut/imgui

Used for the main UI

raylib backend for ImGui

https://github.com/oskaritimperi/imgui-impl-raylib

PhysicsFS

https://github.com/icculus/physfs

Not used for anything yet, but the goal is to use it to read files from PAKs and other archive formats it supports

glslang

https://github.com/KhronosGroup/glslang

Used for preprocessing the shader files

Premake

https://premake.github.io/

'nuff said