Skip to content

Commit 0224f4c

Browse files
committed
- add orbital camera controls and arrow keys to change model
1 parent e875f6c commit 0224f4c

1 file changed

Lines changed: 120 additions & 3 deletions

File tree

DriverLevelTool/viewer/viewer.cpp

Lines changed: 120 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,46 @@
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+
1241
int 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+
1452
void 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

Comments
 (0)