99#include " driver_routines/models.h"
1010#include " driver_routines/textures.h"
1111
12+ #define MODEL_VERTEX_SHADER \
13+ " attribute vec4 a_position_tu;\n " \
14+ " attribute vec4 a_normal_tv;\n " \
15+ " uniform mat4 u_View;\n " \
16+ " uniform mat4 u_Projection;\n " \
17+ " uniform mat4 u_World;\n " \
18+ " uniform mat4 u_WorldViewProj;\n " \
19+ " void main() {\n " \
20+ " v_texcoord = vec2(a_position_tu.w, 1.0-a_normal_tv.w);\n " \
21+ " gl_Position = u_WorldViewProj * vec4(a_position_tu.xyz, 1.0);\n " \
22+ " }\n "
23+
24+ #define MODEL_FRAGMENT_SHADER \
25+ " uniform sampler2D s_texture;\n " \
26+ " void main() {\n " \
27+ " fragColor = texture2D(s_texture, v_texcoord.xy);\n " \
28+ " }\n "
29+
30+ const char * model_shader =
31+ " varying vec2 v_texcoord;\n "
32+ " varying vec4 v_color;\n "
33+ " varying vec4 v_page_clut;\n "
34+ " varying float v_z;\n "
35+ " #ifdef VERTEX\n "
36+ MODEL_VERTEX_SHADER
37+ " #else\n "
38+ MODEL_FRAGMENT_SHADER
39+ " #endif\n " ;
40+
1241int g_quit = 0 ;
1342
43+ int g_currentModel = 0 ;
44+ bool g_holdLeft = false ;
45+ bool g_holdRight = false ;
46+
47+ Vector3D g_cameraPosition (0 );
48+ Vector3D g_cameraAngles (25 .0f , 45 .0f , 0 );
49+ float g_cameraDistance = 0 .5f ;
50+ float g_cameraFOV = 90 .0f ;
51+
1452void SDLPollEvent ()
1553{
1654 SDL_Event event;
@@ -40,6 +78,28 @@ void SDLPollEvent()
4078 case SDL_MOUSEMOTION:
4179 {
4280 // Emulator_DoDebugMouseMotion(event.motion.x, event.motion.y);
81+
82+ if (g_holdLeft)
83+ {
84+ g_cameraAngles.x += event.motion .yrel * 0 .8f ;
85+ g_cameraAngles.y -= event.motion .xrel * 0 .8f ;
86+ }
87+ else if (g_holdRight)
88+ {
89+ g_cameraDistance += event.motion .yrel * 0 .01f ;
90+ }
91+
92+ break ;
93+ }
94+ case SDL_MOUSEBUTTONDOWN:
95+ case SDL_MOUSEBUTTONUP:
96+ {
97+ bool down = (event.type == SDL_MOUSEBUTTONDOWN);
98+
99+ if (event.button .button == 1 )
100+ g_holdLeft = down;
101+ else if (event.button .button == 3 )
102+ g_holdRight = down;
43103 break ;
44104 }
45105 case SDL_KEYDOWN:
@@ -55,6 +115,24 @@ void SDLPollEvent()
55115 else if (nKey == SDL_SCANCODE_RALT)
56116 nKey = SDL_SCANCODE_LALT;
57117
118+ if (event.type == SDL_KEYDOWN)
119+ {
120+ if (nKey == SDL_SCANCODE_LEFT)
121+ {
122+ g_currentModel--;
123+ g_currentModel = MAX (0 , g_currentModel);
124+
125+ Msg (" Current: %d\n " , g_currentModel);
126+ }
127+ else if (nKey == SDL_SCANCODE_RIGHT)
128+ {
129+ g_currentModel++;
130+ g_currentModel = MIN (MAX_MODELS, g_currentModel);
131+
132+ Msg (" Current: %d\n " , g_currentModel);
133+ }
134+ }
135+
58136 // Emulator_DoDebugKeys(nKey, (event.type == SDL_KEYUP) ? false : true);
59137 break ;
60138 }
@@ -139,6 +217,37 @@ void InitHWTexturePage(int nPage)
139217 free (color_data);
140218}
141219
220+ extern int g_windowWidth;
221+ extern int g_windowHeight;
222+
223+ void RenderView ()
224+ {
225+ Vector3D forward, right;
226+ AngleVectors (g_cameraAngles, &forward, &right);
227+
228+ Vector3D cameraPos = g_cameraPosition - forward * g_cameraDistance;
229+ Vector3D cameraAngles = VDEG2RAD (g_cameraAngles);
230+
231+ Matrix4x4 view, proj;
232+
233+ proj = perspectiveMatrixY (DEG2RAD (g_cameraFOV), g_windowWidth, g_windowHeight, 0 .01f , 1000 .0f );
234+ view = rotateZXY4 (-cameraAngles.x , -cameraAngles.y , -cameraAngles.z );
235+
236+ view.translate (-cameraPos);
237+
238+ GR_SetMatrix (MATRIX_VIEW, view);
239+ GR_SetMatrix (MATRIX_PROJECTION, proj);
240+
241+ GR_SetMatrix (MATRIX_WORLD, identity4 ());
242+
243+ GR_UpdateMatrixUniforms ();
244+ GR_SetDepth (1 );
245+ GR_SetCullMode (CULL_FRONT);
246+
247+ if (g_renderModels[g_currentModel])
248+ g_renderModels[g_currentModel]->Draw ();
249+ }
250+
142251// -------------------------------------------------------------
143252// Main level viewer
144253// -------------------------------------------------------------
@@ -150,11 +259,12 @@ int ViewerMain(const char* filename)
150259 return -1 ;
151260 }
152261
262+ // create shader
263+ g_modelShader = GR_CompileShader (model_shader);
264+
153265 // Load level file
154266 LoadLevelFile (filename);
155267
156- // Load VAO
157-
158268 // Load permanent textures
159269 for (int i = 0 ; i < g_numTexPages; i++)
160270 {
@@ -169,6 +279,8 @@ int ViewerMain(const char* filename)
169279 // Load models
170280 for (int i = 0 ; i < MAX_MODELS; i++)
171281 {
282+ g_renderModels[i] = nullptr ;
283+
172284 CRenderModel* model = new CRenderModel ();
173285 if (model->Initialize (&g_levelModels[i]))
174286 g_renderModels[i] = model;
@@ -185,6 +297,9 @@ int ViewerMain(const char* filename)
185297 do
186298 {
187299 SDLPollEvent ();
300+
301+ GR_BeginScene ();
302+
188303 GR_ClearColor (32 , 32 , 32 );
189304 GR_ClearDepth (1 .0f );
190305
@@ -193,7 +308,9 @@ int ViewerMain(const char* filename)
193308 // Spool map
194309
195310 // Render stuff
196- g_renderModels[0 ]->Draw ();
311+ RenderView ();
312+
313+ GR_EndScene ();
197314
198315 GR_SwapWindow ();
199316 } while (!g_quit);
0 commit comments