Skip to content

Commit 7224892

Browse files
committed
- added car model view
1 parent 795a4e1 commit 7224892

1 file changed

Lines changed: 177 additions & 33 deletions

File tree

DriverLevelTool/viewer/viewer.cpp

Lines changed: 177 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,14 @@ bool g_displayCollisionBoxes = false;
3636
bool g_displayHeightMap = false;
3737
bool g_displayAllCellLevels = true;
3838
bool g_displayRoads = false;
39+
bool g_displayRoadConnections = false;
3940
bool g_noLod = false;
4041

4142
int g_cellsDrawDistance = 441;
4243

4344
int g_currentModel = 0;
45+
int g_currentCarResidentModel = 0;
46+
int g_currentCarModel = 0;
4447

4548
int g_viewerMode = 0;
4649

@@ -273,6 +276,67 @@ void RenderModelView()
273276
}
274277
}
275278

279+
CRenderModel g_currentCarHwModel;
280+
ModelRef_t g_carModelRef;
281+
282+
//-------------------------------------------------------
283+
// Render car model viewer
284+
//-------------------------------------------------------
285+
void RenderCarModelView()
286+
{
287+
Volume frustumVolume;
288+
Vector3D forward, right;
289+
AngleVectors(g_cameraAngles, &forward, &right);
290+
291+
// setup orbital camera
292+
CRenderModel::SetupModelShader();
293+
SetupCameraViewAndMatrices(-forward * g_cameraDistance, g_cameraAngles, frustumVolume);
294+
295+
CRenderModel::SetupLightingProperties(1.0f, 0.5f);
296+
297+
GR_SetDepth(1);
298+
GR_SetCullMode(CULL_FRONT);
299+
300+
g_currentCarHwModel.Draw();
301+
302+
if (g_displayCollisionBoxes)
303+
CRenderModel::DrawModelCollisionBox(&g_carModelRef, { 0,0,0 }, 0.0f);
304+
}
305+
306+
//-------------------------------------------------------
307+
// Updates the car HW render model
308+
//-------------------------------------------------------
309+
void UpdateCarRenderModel()
310+
{
311+
CarModelData_t* carModel = g_levModels.GetCarModel(g_currentCarResidentModel);
312+
313+
if (g_currentCarModel == 0)
314+
{
315+
g_carModelRef.model = carModel->cleanmodel;
316+
g_carModelRef.size = carModel->cleanSize;
317+
}
318+
else if (g_currentCarModel == 1)
319+
{
320+
g_carModelRef.model = carModel->dammodel;
321+
g_carModelRef.size = carModel->damSize;
322+
}
323+
else
324+
{
325+
g_carModelRef.model = carModel->lowmodel;
326+
g_carModelRef.size = carModel->lowSize;
327+
}
328+
329+
g_carModelRef.index = 100;
330+
331+
if (g_carModelRef.model)
332+
{
333+
GR_SetVAO(nullptr);
334+
335+
g_currentCarHwModel.Destroy();
336+
g_currentCarHwModel.Initialize(&g_carModelRef);
337+
}
338+
}
339+
276340
//-------------------------------------------------------------
277341
// Forcefully spools entire level regions and area datas
278342
//-------------------------------------------------------------
@@ -488,6 +552,9 @@ void DisplayUI(float deltaTime)
488552

489553
if (ImGui::MenuItem("Model viewer"))
490554
g_viewerMode = 1;
555+
556+
if (ImGui::MenuItem("Car model viewer"))
557+
g_viewerMode = 2;
491558

492559
ImGui::EndMenu();
493560
}
@@ -522,6 +589,9 @@ void DisplayUI(float deltaTime)
522589
if (ImGui::MenuItem("Display roads", nullptr, g_displayRoads))
523590
g_displayRoads ^= 1;
524591

592+
if (ImGui::MenuItem("Display road connections", nullptr, g_displayRoadConnections))
593+
g_displayRoadConnections ^= 1;
594+
525595
ImGui::Separator();
526596

527597
if (ImGui::MenuItem("Reset camera", nullptr, g_noLod))
@@ -559,14 +629,19 @@ void DisplayUI(float deltaTime)
559629
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.5f), "Drawn models: %d", g_drawnModels);
560630
ImGui::TextColored(ImVec4(1.0f, 1.0f, 1.0f, 0.5f), "Drawn polygons: %d", g_drawnPolygons);
561631
}
562-
else if (g_viewerMode == 1)
632+
else if (g_viewerMode >= 1 )
563633
{
564634
ImGui::SetWindowSize(ImVec2(400, 720));
565635

566636
ModelRef_t* ref = g_levModels.GetModelByIndex(g_currentModel);
637+
638+
if (g_viewerMode == 2)
639+
ref = &g_carModelRef;
640+
567641
MODEL* model = ref->model;
568642

569-
ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.5f), "Use arrows to change models");
643+
if (g_viewerMode == 1)
644+
ImGui::TextColored(ImVec4(1.0f, 1.0f, 0.0f, 1.5f), "Use arrows to change models");
570645

571646
if(model)
572647
{
@@ -642,47 +717,110 @@ void DisplayUI(float deltaTime)
642717
ImGui::Text("");
643718
ImGui::Text("");
644719
ImGui::Text("");
720+
ImGui::Text("");
721+
ImGui::Text("");
722+
ImGui::Text("");
723+
ImGui::Text("");
724+
ImGui::Text("");
645725
}
646726

647-
ImGui::InputText("Filter", g_modelSearchNameBuffer, sizeof(g_modelSearchNameBuffer));
727+
// regular model renderer
728+
if (g_viewerMode == 1)
729+
{
730+
ImGui::InputText("Filter", g_modelSearchNameBuffer, sizeof(g_modelSearchNameBuffer));
648731

649-
ImGuiTextFilter filter(g_modelSearchNameBuffer);
732+
ImGuiTextFilter filter(g_modelSearchNameBuffer);
650733

651-
Array<ModelRef_t*> modelRefs;
652-
653-
for (int i = 0; i < MAX_MODELS; i++)
654-
{
655-
ModelRef_t* itemRef = g_levModels.GetModelByIndex(i);
656-
657-
if(!filter.IsActive() && !itemRef->name || itemRef->name && filter.PassFilter(itemRef->name))
658-
modelRefs.append(itemRef);
659-
}
660-
661-
if (ImGui::ListBoxHeader("", modelRefs.size(), 30))
662-
{
663-
ImGuiListClipper clipper(modelRefs.size(), ImGui::GetTextLineHeightWithSpacing());
664-
665-
while (clipper.Step())
734+
Array<ModelRef_t*> modelRefs;
735+
736+
for (int i = 0; i < MAX_MODELS; i++)
666737
{
667-
for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
668-
{
669-
ModelRef_t* itemRef = modelRefs[i];
670-
const bool item_selected = (itemRef->index == g_currentModel);
671-
672-
String item = String::fromPrintf("%d: %s%s", itemRef->index, itemRef->name ? itemRef->name : "", itemRef->model ? "" : "(empty slot)");
738+
ModelRef_t* itemRef = g_levModels.GetModelByIndex(i);
673739

674-
ImGui::PushID(i);
740+
if (!filter.IsActive() && !itemRef->name || itemRef->name && filter.PassFilter(itemRef->name))
741+
modelRefs.append(itemRef);
742+
}
743+
744+
if (ImGui::ListBoxHeader("", modelRefs.size(), 30))
745+
{
746+
ImGuiListClipper clipper(modelRefs.size(), ImGui::GetTextLineHeightWithSpacing());
675747

676-
if (ImGui::Selectable(item, item_selected))
748+
while (clipper.Step())
749+
{
750+
for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
677751
{
678-
g_currentModel = itemRef->index;
752+
ModelRef_t* itemRef = modelRefs[i];
753+
const bool item_selected = (itemRef->index == g_currentModel);
754+
755+
String item = String::fromPrintf("%d: %s%s", itemRef->index, itemRef->name ? itemRef->name : "", itemRef->model ? "" : "(empty slot)");
756+
757+
ImGui::PushID(i);
758+
759+
if (ImGui::Selectable(item, item_selected))
760+
{
761+
g_currentModel = itemRef->index;
762+
}
763+
764+
ImGui::PopID();
679765
}
766+
}
767+
ImGui::ListBoxFooter();
768+
}
769+
}
770+
else if (g_viewerMode == 2)
771+
{ // car model renderer
772+
773+
if (ImGui::Button("Clean"))
774+
{
775+
g_currentCarModel = 0;
776+
UpdateCarRenderModel();
777+
}
680778

681-
ImGui::PopID();
779+
// if (ImGui::Button("Damaged"))
780+
// {
781+
// g_currentCarModel = 1;
782+
// UpdateCarRenderModel();
783+
// }
784+
785+
ImGui::SameLine();
786+
if (ImGui::Button("Low poly"))
787+
{
788+
g_currentCarModel = 2;
789+
UpdateCarRenderModel();
790+
}
791+
792+
793+
if (ImGui::ListBoxHeader("", 12, 30))
794+
{
795+
ImGuiListClipper clipper(12, ImGui::GetTextLineHeightWithSpacing());
796+
797+
while (clipper.Step())
798+
{
799+
for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
800+
{
801+
CarModelData_t* itemRef = g_levModels.GetCarModel(i);
802+
803+
const bool item_selected = (i == g_currentCarResidentModel);
804+
805+
String item = String::fromPrintf("Model %d: %s", i, itemRef->cleanmodel ? "" : "(empty slot)");
806+
807+
ImGui::PushID(i);
808+
809+
if (ImGui::Selectable(item, item_selected))
810+
{
811+
g_currentCarResidentModel = i;
812+
UpdateCarRenderModel();
813+
}
814+
815+
ImGui::PopID();
816+
}
682817
}
818+
ImGui::ListBoxFooter();
683819
}
684-
ImGui::ListBoxFooter();
820+
821+
685822
}
823+
686824
}
687825
ImGui::End();
688826
}
@@ -783,7 +921,7 @@ void SDLPollEvent()
783921
{
784922
if (g_viewerMode == 0)
785923
g_cameraMoveDir.z = (event.type == SDL_KEYDOWN) ? 1.0f : 0.0f;
786-
else if (g_viewerMode == 1 && (event.type == SDL_KEYDOWN))
924+
else if (g_viewerMode >= 1 && (event.type == SDL_KEYDOWN))
787925
{
788926
g_currentModel--;
789927
g_currentModel = MAX(0, g_currentModel);
@@ -793,7 +931,7 @@ void SDLPollEvent()
793931
{
794932
if (g_viewerMode == 0)
795933
g_cameraMoveDir.z = (event.type == SDL_KEYDOWN) ? -1.0f : 0.0f;
796-
else if (g_viewerMode == 1 && (event.type == SDL_KEYDOWN))
934+
else if (g_viewerMode >= 1 && (event.type == SDL_KEYDOWN))
797935
{
798936
g_currentModel++;
799937
g_currentModel = MIN(MAX_MODELS, g_currentModel);
@@ -862,10 +1000,14 @@ void ViewerMainLoop()
8621000
UpdateCameraMovement(deltaTime, cameraSpeedModifier);
8631001
RenderLevelView();
8641002
}
865-
else
1003+
else if(g_viewerMode == 1)
8661004
{
8671005
RenderModelView();
8681006
}
1007+
else
1008+
{
1009+
RenderCarModelView();
1010+
}
8691011

8701012
DebugOverlay_Draw();
8711013

@@ -920,6 +1062,8 @@ int ViewerMain()
9201062
// this is for filtering purposes
9211063
PopulateUIModelNames();
9221064

1065+
UpdateCarRenderModel();
1066+
9231067
// loop and stuff
9241068
ViewerMainLoop();
9251069

0 commit comments

Comments
 (0)