Skip to content

Commit

Permalink
Fix paths, fix linux, fix model render.
Browse files Browse the repository at this point in the history
Fix paths, fix linux, fix model render. (limit 30 fps, because code is bad optimized)
  • Loading branch information
Karaulov committed Dec 23, 2022
1 parent 9d71a77 commit 2ee0704
Show file tree
Hide file tree
Showing 12 changed files with 165 additions and 72 deletions.
16 changes: 8 additions & 8 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -90,23 +90,23 @@ include_directories(imgui)
include_directories(imgui/examples)
include_directories(imgui/misc/cpp)
include_directories(imgui/backends)
include_directories(fmt)
include_directories(fmt/include)
include_directories(glew/include)

add_executable(${PROJECT_NAME} ${SOURCE_FILES})

add_subdirectory(fmt)
add_subdirectory(glfw)

find_package(fmt)
target_link_libraries(${PROJECT_NAME} fmt::fmt ${CMAKE_DL_LIBS})
target_link_libraries(${PROJECT_NAME} glfw ${CMAKE_DL_LIBS})
target_link_libraries(${PROJECT_NAME} fmt ${CMAKE_DL_LIBS})

add_definitions(-DGLEW_STATIC)
add_definitions(-DNDEBUG)

set(CMAKE_CXX_STANDARD_REQUIRED True)

if(MSVC)
add_subdirectory(glfw)
add_subdirectory(fmt)

# compile using the static runtime
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++latest")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /MD /wd4244 /wd4018")
Expand Down Expand Up @@ -222,9 +222,9 @@ if(MSVC)
add_definitions(-DNOMINMAX)
else()
target_link_libraries(${PROJECT_NAME} GL GLU X11 Xxf86vm Xrandr pthread Xi GLEW stdc++fs)
set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_FLAGS "-Wall -std=c++2b -exceptions")
set(CMAKE_CXX_FLAGS "-Wall -std=c++2a -exceptions")
set(CMAKE_CXX_FLAGS_DEBUG "-g -O0")
set(PICO_ENABLE_CXX_EXCEPTIONS 1)
set(CMAKE_CXX_FLAGS_RELEASE "-Os -w -Wfatal-errors")
Expand Down
49 changes: 34 additions & 15 deletions src/editor/BspRenderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1292,36 +1292,56 @@ void BspRenderer::refreshEnt(int entIdx)
{
if (ent->hasKey("model") || g_app->fgd)
{
std::string modelpath;
if (ent->hasKey("model"))
std::string modelpath = std::string();

if (ent->hasKey("model") && modelpath.size())
{
modelpath = ent->keyvalues["model"];
}

if (g_app->fgd && modelpath.empty())
{
FgdClass* fgdClass = g_app->fgd->getFgdClass(ent->keyvalues["classname"]);
if (fgdClass)
if (fgdClass && !fgdClass->model.empty())
{
modelpath = fgdClass->model;
}
}

if (!renderEnts[entIdx].mdl || renderEnts[entIdx].mdl->filename != modelpath)
if (renderEnts[entIdx].mdlFileName.size() && !modelpath.size() || renderEnts[entIdx].mdlFileName != modelpath)
{
renderEnts[entIdx].mdlFileName = modelpath;
std::string lowerpath = toLowerCase(modelpath);
std::string newModelPath;
if (lowerpath.ends_with(".mdl"))
{
std::string newModelPath;
if (FindPathInAssets(modelpath, newModelPath))
{
if (renderEnts[entIdx].mdl)
{
delete renderEnts[entIdx].mdl;
renderEnts[entIdx].mdl = NULL;
}
renderEnts[entIdx].mdl = new StudioModel(newModelPath);
renderEnts[entIdx].mdl->UpdateModelMeshList();
}
else
{

if (modelpath.size())
FindPathInAssets(modelpath, newModelPath, true);
if (renderEnts[entIdx].mdl)
{
delete renderEnts[entIdx].mdl;
renderEnts[entIdx].mdl = NULL;
}
}
}
else
{
if (renderEnts[entIdx].mdl)
{
delete renderEnts[entIdx].mdl;
renderEnts[entIdx].mdl = NULL;
}
}
}
Expand Down Expand Up @@ -1648,13 +1668,13 @@ void BspRenderer::render(std::vector<int> highlightEnts, bool highlightAlwaysOnT
activeShader->modelMat->translate(renderOffset.x, renderOffset.y, renderOffset.z);
activeShader->updateMatrixes();

for (size_t i = 0; i < map->ents.size(); i++)
{
if (renderEnts[i].mdl && renderEnts[i].mdl->mdl_mesh_groups.size())
{
renderEnts[i].mdl->AdvanceFrame(g_app->curTime - g_app->oldTime);
}
}
//for (size_t i = 0; i < map->ents.size(); i++)
//{
// if (renderEnts[i].mdl && renderEnts[i].mdl->mdl_mesh_groups.size())
// {
// renderEnts[i].mdl->AdvanceFrame(g_app->curTime - g_app->oldTime);
// }
//}

// draw highlighted ent first so other ent edges don't overlap the highlighted edges
if (highlightEnts.size() && !highlightAlwaysOnTop)
Expand Down Expand Up @@ -2008,9 +2028,8 @@ void BspRenderer::drawPointEntities(std::vector<int> highlightEnts)
}
else
{
renderEnts[i].pointEntCube->selectBuffer->drawFull();
renderEnts[i].pointEntCube->buffer->drawFull();
}
renderEnts[i].pointEntCube->buffer->drawFull();
//renderEnts[i].pointEntCube->wireframeBuffer->drawFull();
}
}
Expand Down
4 changes: 4 additions & 0 deletions src/editor/BspRenderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,18 +63,22 @@ struct RenderEnt
bool needAngles = false;
bool hide = false;
StudioModel* mdl;
std::string mdlFileName;
RenderEnt()
{
modelMatAngles = modelMatOrigin = mat4x4();
offset = angles = vec3();
modelIdx = 0;
pointEntCube = NULL;
mdl = NULL;
mdlFileName = "";
}
~RenderEnt()
{
if (mdl)
delete mdl;

mdl = NULL;
}
};

Expand Down
25 changes: 23 additions & 2 deletions src/editor/Fgd.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -229,12 +229,16 @@ void Fgd::parseClassHeader(FgdClass& fgdClass)
{
logf("ERROR: Expected 3 components in color() property (line {}) in FGD {}\n", lineNum, name);
}

fgdClass.colorSet = true;
}
else if (lpart.find("studio(") == 0)
{
fgdClass.model = getValueInParens(typeParts[i]);
std::string mdlpath = getValueInParens(typeParts[i]);
if (mdlpath.size())
{
fgdClass.model = mdlpath;
fixupPath(fgdClass.model, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE);
}
fgdClass.isModel = true;
}
else if (lpart.find("sequence(") == 0)
Expand All @@ -244,6 +248,7 @@ void Fgd::parseClassHeader(FgdClass& fgdClass)
else if (lpart.find("iconsprite(") == 0)
{
fgdClass.iconSprite = getValueInParens(typeParts[i]);
fixupPath(fgdClass.iconSprite, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE);
}
else if (lpart.find("sprite(") == 0)
{
Expand Down Expand Up @@ -546,6 +551,22 @@ void Fgd::processClassInheritance()
}
}
}

for (int c = 0; c < classes[i]->keyvalues.size(); c++)
{
if (classes[i]->keyvalues[c].iType == FGD_KEY_CHOICES)
{
if (classes[i]->keyvalues[c].name == "model")
{
if (!classes[i]->model.size())
{
classes[i]->model = classes[i]->keyvalues[c].defaultValue;
fixupPath(classes[i]->model, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE);
//classes[i]->isModel = true;
}
}
}
}
}

}
Expand Down
3 changes: 2 additions & 1 deletion src/editor/Fgd.h
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,8 @@ struct FgdClass
FgdClass()
{
classType = FGD_CLASS_POINT;
name = "???";
name = "";
model = "";
isSprite = false;
isModel = false;
isDecal = false;
Expand Down
37 changes: 1 addition & 36 deletions src/editor/Gui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4855,42 +4855,7 @@ void Gui::drawSettings()

if (oldShowSettings && !showSettingsWidget)
{
/* fixup gamedir */
fixupPath(g_settings.gamedir, FIXUPPATH_SLASH::FIXUPPATH_SLASH_SKIP, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE);

if (g_settings.workingdir.find(':') == std::string::npos)
{
/* fixup workingdir for relative to gamedir */
fixupPath(g_settings.workingdir, FIXUPPATH_SLASH::FIXUPPATH_SLASH_CREATE, FIXUPPATH_SLASH::FIXUPPATH_SLASH_CREATE);
}
else
{
/* fixup absolute workdir */
fixupPath(g_settings.workingdir, FIXUPPATH_SLASH::FIXUPPATH_SLASH_SKIP, FIXUPPATH_SLASH::FIXUPPATH_SLASH_CREATE);
}

for (auto& s : g_settings.fgdPaths)
{
if (s.path.find(':') == std::string::npos)
{
fixupPath(s.path, FIXUPPATH_SLASH::FIXUPPATH_SLASH_CREATE, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE);
}
else
{
fixupPath(s.path, FIXUPPATH_SLASH::FIXUPPATH_SLASH_SKIP, FIXUPPATH_SLASH::FIXUPPATH_SLASH_REMOVE);
}
}
for (auto& s : g_settings.resPaths)
{
if (s.path.find(':') == std::string::npos)
{
fixupPath(s.path, FIXUPPATH_SLASH::FIXUPPATH_SLASH_CREATE, FIXUPPATH_SLASH::FIXUPPATH_SLASH_CREATE);
}
else
{
fixupPath(s.path, FIXUPPATH_SLASH::FIXUPPATH_SLASH_SKIP, FIXUPPATH_SLASH::FIXUPPATH_SLASH_CREATE);
}
}
FixupAllSystemPaths();
g_settings.save();
if (!app->reloading)
{
Expand Down
13 changes: 8 additions & 5 deletions src/editor/Renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -605,6 +605,9 @@ void AppSettings::load()
transparentEntities.push_back("func_buyzone");
}


FixupAllSystemPaths();

entListReload = false;
}

Expand Down Expand Up @@ -975,10 +978,10 @@ void Renderer::renderLoop()
}
}

if (SelectedMap && SelectedMap->mdl)
{
SelectedMap->mdl->AdvanceFrame(curTime - oldTime);
}
//if (SelectedMap && SelectedMap->mdl)
//{
// SelectedMap->mdl->AdvanceFrame(curTime - oldTime);
//}

int modelIdx = -1;
int entIdx = pickInfo.GetSelectedEnt();
Expand Down Expand Up @@ -2727,7 +2730,7 @@ void Renderer::reloadBspModels()
if (entity->hasKey("model"))
{
std::string modelPath = entity->keyvalues["model"];
if (toLowerCase(modelPath).find(".bsp") != std::string::npos)
if (toLowerCase(modelPath).ends_with(".bsp"))
{
std::string newBspPath;
if (FindPathInAssets(modelPath, newBspPath))
Expand Down
4 changes: 2 additions & 2 deletions src/editor/Renderer.h
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,8 @@ class Renderer

Gui* gui;

GLFWwindow* window;

Fgd* fgd = NULL;

bool hideGui = false;
Expand Down Expand Up @@ -210,8 +212,6 @@ class Renderer
bool isEntTransparent(const char* classname);
private:
Bsp* SelectedMap = NULL;

GLFWwindow* window;
PointEntRenderer* pointEntRenderer;
PointEntRenderer* swapPointEntRenderer = NULL;

Expand Down
10 changes: 9 additions & 1 deletion src/mdl/mdl_studio.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -869,6 +869,8 @@ void StudioModel::GetModelMeshes(int& bodies, int& subbodies, int& skins, int& m

void StudioModel::DrawModel(int bodynum, int subbodynum, int skinnum, int meshnum)
{
this->frametime += g_app->curTime - g_app->oldTime;

if (SetBodygroup(bodynum, subbodynum) != -1)
{
// Need clear all model data and refresh it for new subbody
Expand All @@ -889,7 +891,13 @@ void StudioModel::DrawModel(int bodynum, int subbodynum, int skinnum, int meshnu
mdl_mesh_groups = std::vector<std::vector<StudioMesh>>();
}
SetSkin(skinnum);
UpdateModelMeshList();

if (this->frametime > (1.0f / fps))
{
AdvanceFrame(this->frametime);
UpdateModelMeshList();
this->frametime = 0.0f;
}

Texture* validTexture = NULL;

Expand Down
4 changes: 4 additions & 0 deletions src/mdl/mdl_studio.h
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,8 @@ class StudioModel
{
public:
// entity settings
float fps;
float frametime; //for small fps render
float m_frame; // frame
int m_sequence; // sequence index
int m_bodynum; // bodypart selection
Expand Down Expand Up @@ -424,6 +426,8 @@ class StudioModel

StudioModel(std::string modelname)
{
fps = 30.0;
frametime = 99999.0f;
filename = modelname;
g_vright = vec3();
g_lambert = 1.0f;
Expand Down
Loading

0 comments on commit 2ee0704

Please sign in to comment.