@@ -36,11 +36,14 @@ bool g_displayCollisionBoxes = false;
3636bool g_displayHeightMap = false ;
3737bool g_displayAllCellLevels = true ;
3838bool g_displayRoads = false ;
39+ bool g_displayRoadConnections = false ;
3940bool g_noLod = false ;
4041
4142int g_cellsDrawDistance = 441 ;
4243
4344int g_currentModel = 0 ;
45+ int g_currentCarResidentModel = 0 ;
46+ int g_currentCarModel = 0 ;
4447
4548int 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