From 0331883a86c0b9d0052301bf8b8e8bdde226143e Mon Sep 17 00:00:00 2001 From: Ykkrosh Date: Fri, 20 May 2005 17:09:47 +0000 Subject: [PATCH] Temporary fix for mouse input. Improved performance in player-colour model renderer. Also improved performance in lighting, at least in unoptimised builds. This was SVN commit r2328. --- .../official/gui/test/functions_session.js | 15 ++++++++--- source/graphics/GameView.cpp | 2 ++ source/graphics/Model.cpp | 3 +++ source/ps/Interact.cpp | 4 +-- source/renderer/ModelRData.cpp | 6 +++++ source/renderer/PlayerRenderer.cpp | 25 +++++------------ source/renderer/PlayerRenderer.h | 12 ++------- source/renderer/Renderer.cpp | 12 +++++++-- source/renderer/SHCoeffs.cpp | 27 +++++++++++-------- source/renderer/TransparencyRenderer.cpp | 5 +++- source/scripting/ScriptGlue.cpp | 16 ++++++++--- source/scripting/ScriptGlue.h | 4 ++- 12 files changed, 79 insertions(+), 52 deletions(-) diff --git a/binaries/data/mods/official/gui/test/functions_session.js b/binaries/data/mods/official/gui/test/functions_session.js index 320a2bd64e..df0c735a36 100755 --- a/binaries/data/mods/official/gui/test/functions_session.js +++ b/binaries/data/mods/official/gui/test/functions_session.js @@ -315,13 +315,22 @@ function FlipGUI(NewGUIType) } +// ==================================================================== + +// Unpleasant system-dependent hack. The input system should be fixed... +var SDL_BUTTON_LEFT = 0; +var SDL_BUTTON_RIGHT = 1; +var SDL_BUTTON_MIDDLE = 2; +var SDL_BUTTON_WHEELUP = 3; +var SDL_BUTTON_WHEELDOWN = 4; + function selectEntity(handler) { endSelection(); startSelection(function (event) { // Selection is performed when single-clicking the right mouse // button. - if (event.button == 3 && event.clicks == 1) + if (event.button == SDL_BUTTON_RIGHT && event.clicks == 1) { handler(event.entity); } @@ -336,7 +345,7 @@ function selectLocation(handler) startSelection(function (event) { // Selection is performed when single-clicking the right mouse // button. - if (event.button == 3 && event.clicks == 1) + if (event.button == SDL_BUTTON_RIGHT && event.clicks == 1) { handler(event.x, event.y); } @@ -381,7 +390,7 @@ function worldClickHandler(event) // Right button single- or double-clicks - if (event.button == 3 && event.clicks <= 2) + if (event.button == SDL_BUTTON_RIGHT && event.clicks <= 2) { if (event.clicks == 1) cmd = event.command; diff --git a/source/graphics/GameView.cpp b/source/graphics/GameView.cpp index 95273cb829..a75a690ecc 100755 --- a/source/graphics/GameView.cpp +++ b/source/graphics/GameView.cpp @@ -164,6 +164,7 @@ void CGameView::RenderModels(CUnitManager *pUnitMan, CProjectileManager *pProjec const std::vector& units=pUnitMan->GetUnits(); for (uint i=0;iGetModel()->GetBounds())) { + PROFILE( "submit models" ); SubmitModelRecursive(units[i]->GetModel()); } } @@ -171,6 +172,7 @@ void CGameView::RenderModels(CUnitManager *pUnitMan, CProjectileManager *pProjec const std::vector& projectiles=pProjectileMan->GetProjectiles(); for (uint i=0;iGetModel()->GetBounds())) { + PROFILE( "submit projectiles" ); SubmitModelRecursive(projectiles[i]->GetModel()); } } diff --git a/source/graphics/Model.cpp b/source/graphics/Model.cpp index 5bbb7cabc6..5bd665b587 100755 --- a/source/graphics/Model.cpp +++ b/source/graphics/Model.cpp @@ -18,6 +18,7 @@ #include "MeshManager.h" #include "lib/res/ogl_tex.h" #include "lib/res/h_mgr.h" +#include "Profile.h" #include "ps/CLogger.h" #define LOG_CATEGORY "graphics" @@ -261,6 +262,8 @@ void CModel::GenerateBoneMatrices() { if (!m_Anim || !m_BoneMatrices) return; + PROFILE( "generating bone matrices" ); + assert(m_pModelDef->GetNumBones() == m_Anim->m_AnimDef->GetNumKeys()); m_Anim->m_AnimDef->BuildBoneMatrices(m_AnimTime,m_BoneMatrices); diff --git a/source/ps/Interact.cpp b/source/ps/Interact.cpp index fba26d1ea8..f2f8253d62 100755 --- a/source/ps/Interact.cpp +++ b/source/ps/Interact.cpp @@ -857,8 +857,8 @@ int interactInputHandler( const SDL_Event* ev ) return( EV_HANDLED ); case SDL_MOUSEBUTTONUP: { - // Assumes SDL button enums in range [1, 5] - int button = ev->button.button - 1; + // Assumes SDL button enums are contiguous + int button = ev->button.button - SDL_BUTTON_LEFT; // Only process buttons within the range for which we have button state // arrays above. if (button >= 0 && button < 5) diff --git a/source/renderer/ModelRData.cpp b/source/renderer/ModelRData.cpp index a74b7d15a6..8f7f7023df 100755 --- a/source/renderer/ModelRData.cpp +++ b/source/renderer/ModelRData.cpp @@ -10,6 +10,7 @@ #include "Model.h" #include "ModelDef.h" #include "MaterialManager.h" +#include "Profile.h" /////////////////////////////////////////////////////////////////// // shared list of all submitted models this frame @@ -153,6 +154,7 @@ void CModelRData::BuildVertices() const CMatrix3D* bonematrices=m_Model->GetBoneMatrices(); if (bonematrices) { // boned model - calculate skinned vertex positions/normals + PROFILE( "skinning bones" ); const CMatrix3D* invbonematrices=m_Model->GetInvBoneMatrices(); for (uint j=0; jGetRenderData(); if (data==0) { // no renderdata for model, create it now + PROFILE( "create render data" ); data=new CModelRData(model); model->SetRenderData(data); } else { + PROFILE( "update render data" ); data->Update(); } diff --git a/source/renderer/PlayerRenderer.cpp b/source/renderer/PlayerRenderer.cpp index f86f145f93..45a400b276 100644 --- a/source/renderer/PlayerRenderer.cpp +++ b/source/renderer/PlayerRenderer.cpp @@ -16,6 +16,7 @@ #include "PlayerRenderer.h" #include "Model.h" #include "Game.h" +#include "Profile.h" CPlayerRenderer g_PlayerRenderer; @@ -57,6 +58,8 @@ void CPlayerRenderer::SetupColorRenderStates() // are drawn in correct order void CPlayerRenderer::Render() { + PROFILE( "render player models" ); + if (m_Objects.size()==0) return; // switch on wireframe if we need it @@ -167,21 +170,7 @@ void CPlayerRenderer::Clear() void CPlayerRenderer::Add(CModel* model) { - // resize array, get last object in list - m_Objects.resize(m_Objects.size()+1); - - SObject& obj=m_Objects.back(); - obj.m_Model=model; - - // build transform from object to camera space - CMatrix3D objToCam,invcam; - g_Renderer.m_Camera.m_Orientation.GetInverse(objToCam); - objToCam*=model->GetTransform(); - - // resort model indices from back to front, according to camera position - and store - // the returned sqrd distance to the centre of the nearest triangle - CModelRData* modeldata=(CModelRData*) model->GetRenderData(); - obj.m_Dist=modeldata->BackToFrontIndexSort(objToCam); + m_Objects.push_back(model); } //TODO: Correctly implement shadows for the players @@ -197,8 +186,8 @@ void CPlayerRenderer::RenderShadows() void CPlayerRenderer::RenderObjectsStreams(u32 streamflags, bool iscolorpass, u32 mflags) { for (uint i=0;iGetFlags() & mflags)) { - CModelRData* modeldata=(CModelRData*) m_Objects[i].m_Model->GetRenderData(); + if (!mflags || (m_Objects[i]->GetFlags() & mflags)) { + CModelRData* modeldata=(CModelRData*) m_Objects[i]->GetRenderData(); // Setup the render states to apply the second texture ( i.e. player color ) if (iscolorpass) @@ -208,7 +197,7 @@ void CPlayerRenderer::RenderObjectsStreams(u32 streamflags, bool iscolorpass, u3 // SetupColorRenderStates() below this if statement. // Get the player color - SMaterialColor colour = m_Objects[i].m_Model->GetMaterial().GetPlayerColor(); + SMaterialColor colour = m_Objects[i]->GetMaterial().GetPlayerColor(); float* color = &colour.r; // because it's stored RGBA // Just like it says, Sets up the player color render states diff --git a/source/renderer/PlayerRenderer.h b/source/renderer/PlayerRenderer.h index ce5784340c..70eb6cbe9b 100644 --- a/source/renderer/PlayerRenderer.h +++ b/source/renderer/PlayerRenderer.h @@ -18,14 +18,6 @@ class CModel; class CPlayerRenderer { -public: - struct SObject { - // the transparent model - CModel* m_Model; - // sqrd distance from camera to centre of nearest triangle - float m_Dist; - }; - public: // add object to render in deferred transparency pass void Add(CModel* model); @@ -41,8 +33,8 @@ private: void RenderObjectsStreams(u32 streamflags, bool iscolorpass=false, u32 mflags=0); // setup the second pass for the player color void SetupColorRenderStates(); - // list of transparent objects to render - std::vector m_Objects; + // list of objects to render + std::vector m_Objects; }; extern CPlayerRenderer g_PlayerRenderer; diff --git a/source/renderer/Renderer.cpp b/source/renderer/Renderer.cpp index 922c9468df..a755dfe9ac 100755 --- a/source/renderer/Renderer.cpp +++ b/source/renderer/Renderer.cpp @@ -28,6 +28,7 @@ #include "LightEnv.h" #include "CLogger.h" #include "ps/Game.h" +#include "Profile.h" #include "Model.h" #include "ModelDef.h" @@ -589,6 +590,8 @@ void CRenderer::CreateShadowMap() void CRenderer::RenderShadowMap() { + PROFILE( "render shadow map" ); + // create shadow map if we haven't already got one if (!m_ShadowMap) CreateShadowMap(); @@ -712,6 +715,8 @@ void CRenderer::RenderShadowMap() void CRenderer::ApplyShadowMap() { + PROFILE( "applying shadows" ); + CMatrix3D tmp2; CMatrix3D texturematrix; @@ -737,6 +742,8 @@ void CRenderer::ApplyShadowMap() void CRenderer::RenderPatches() { + PROFILE(" render patches "); + // switch on wireframe if we need it if (m_TerrainRenderMode==WIREFRAME) { MICROLOG(L"wireframe on"); @@ -828,6 +835,8 @@ void CRenderer::RenderModelSubmissions() void CRenderer::RenderModels() { + PROFILE( "render models "); + // switch on wireframe if we need it if (m_ModelRenderMode==WIREFRAME) { glPolygonMode(GL_FRONT_AND_BACK,GL_LINE); @@ -893,7 +902,6 @@ void CRenderer::FlushFrame() oglCheck(); // sort all the transparent stuff - MICROLOG(L"sorting"); g_TransparencyRenderer.Sort(); if (!m_ShadowRendered) { @@ -902,7 +910,6 @@ void CRenderer::FlushFrame() RenderShadowMap(); } // clear buffers - MICROLOG(L"clear buffer"); glClearColor(m_ClearColor[0],m_ClearColor[1],m_ClearColor[2],m_ClearColor[3]); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); } @@ -993,6 +1000,7 @@ void CRenderer::Submit(CPatch* patch) void CRenderer::Submit(CModel* model) { if (model->GetFlags() & MODELFLAG_CASTSHADOWS) { + PROFILE( "updating shadow bounds" ); m_ShadowBound+=model->GetBounds(); } diff --git a/source/renderer/SHCoeffs.cpp b/source/renderer/SHCoeffs.cpp index 7dff994ef4..79282735ae 100755 --- a/source/renderer/SHCoeffs.cpp +++ b/source/renderer/SHCoeffs.cpp @@ -61,17 +61,22 @@ void CSHCoeffs::Evaluate(const CVector3D& normal,RGBColor& color) const float c7=(3*SQR(normal.Z)-1.0f); float c8=(SQR(normal.X)-SQR(normal.Y)); - for (int i=0;i<3;i++) { - color[i]=_data[0][i]; - color[i]+=_data[1][i]*normal.X; - color[i]+=_data[2][i]*normal.Y; - color[i]+=_data[3][i]*normal.Z; - color[i]+=_data[4][i]*c4; - color[i]+=_data[5][i]*c5; - color[i]+=_data[6][i]*c6; - color[i]+=_data[7][i]*c7; - color[i]+=_data[8][i]*c8; - } +#define DO(C) \ + color.C = \ + _data[0].C \ + + _data[1].C*normal.X \ + + _data[2].C*normal.Y \ + + _data[3].C*normal.Z \ + + _data[4].C*c4 \ + + _data[5].C*c5 \ + + _data[6].C*c6 \ + + _data[7].C*c7 \ + + _data[8].C*c8 + DO(X); + DO(Y); + DO(Z); +#undef DO + #else // debug aid: output quantised normal color=RGBColor((normal.X+1)*0.5,(normal.Y+1)*0.5,(normal.Z+1)*0.5); diff --git a/source/renderer/TransparencyRenderer.cpp b/source/renderer/TransparencyRenderer.cpp index e44d180e8b..eac9cf23f7 100755 --- a/source/renderer/TransparencyRenderer.cpp +++ b/source/renderer/TransparencyRenderer.cpp @@ -12,7 +12,7 @@ #include "Renderer.h" #include "TransparencyRenderer.h" #include "Model.h" - +#include "Profile.h" CTransparencyRenderer g_TransparencyRenderer; @@ -31,6 +31,7 @@ struct SortObjectsByDist { // Sort: coarsely sort submitted objects in back to front manner void CTransparencyRenderer::Sort() { + PROFILE( "sorting transparent" ); std::sort(m_Objects.begin(),m_Objects.end(),SortObjectsByDist()); } @@ -39,6 +40,8 @@ void CTransparencyRenderer::Sort() // are drawn in correct order void CTransparencyRenderer::Render() { + PROFILE( "render transparent models" ); + if (m_Objects.size()==0) return; // switch on wireframe if we need it diff --git a/source/scripting/ScriptGlue.cpp b/source/scripting/ScriptGlue.cpp index c1dac3742e..1349e459d0 100755 --- a/source/scripting/ScriptGlue.cpp +++ b/source/scripting/ScriptGlue.cpp @@ -90,6 +90,7 @@ JSFunctionSpec ScriptFunctionTable[] = {"forceGC", forceGC, 0, 0, 0 }, {"vmem", vmem, 0, 0, 0 }, {"_rewriteMaps", _rewriteMaps, 0, 0, 0 }, + {"_lodbias", _lodbias, 0, 0, 0 }, {0, 0, 0, 0, 0} }; @@ -532,20 +533,20 @@ JSBool buildTime(JSContext* context, JSObject* UNUSEDPARAM(globalObject), unsign extern void kill_mainloop(); // from main.cpp -JSBool exitProgram(JSContext* UNUSEDPARAM(context), JSObject* UNUSEDPARAM(globalObject), unsigned int UNUSEDPARAM(argc), jsval* UNUSEDPARAM(argv), jsval* UNUSEDPARAM(rval)) +JSBool exitProgram(JSContext* context, JSObject* globalObject, unsigned int argc, jsval* UNUSEDPARAM(argv), jsval* UNUSEDPARAM(rval)) { kill_mainloop(); return JS_TRUE; } -JSBool crash(JSContext* UNUSEDPARAM(context), JSObject* UNUSEDPARAM(globalObject), unsigned int UNUSEDPARAM(argc), jsval* UNUSEDPARAM(argv), jsval* UNUSEDPARAM(rval)) +JSBool crash(JSContext* context, JSObject* globalObject, unsigned int argc, jsval* argv, jsval* rval) { MICROLOG(L"Crashing at user's request."); uintptr_t ptr = 0xDEADC0DE; // oh dear, might this be an invalid pointer? return *(JSBool*) ptr; } -JSBool vmem(JSContext* UNUSEDPARAM(context), JSObject* UNUSEDPARAM(globalObject), unsigned int UNUSEDPARAM(argc), jsval* UNUSEDPARAM(argv), jsval* UNUSEDPARAM(rval)) +JSBool vmem(JSContext* context, JSObject* globalObject, unsigned int argc, jsval* argv, jsval* rval) { #ifdef _WIN32 int left, total; @@ -560,13 +561,20 @@ JSBool vmem(JSContext* UNUSEDPARAM(context), JSObject* UNUSEDPARAM(globalObject) return JS_TRUE; } -JSBool _rewriteMaps(JSContext* UNUSEDPARAM(context), JSObject* UNUSEDPARAM(globalObject), unsigned int UNUSEDPARAM(argc), jsval* UNUSEDPARAM(argv), jsval* UNUSEDPARAM(rval)) +JSBool _rewriteMaps(JSContext* context, JSObject* globalObject, unsigned int argc, jsval* argv, jsval* rval) { extern CLightEnv g_LightEnv; CMapWriter::RewriteAllMaps(g_Game->GetWorld()->GetTerrain(), g_Game->GetWorld()->GetUnitManager(), &g_LightEnv); return JS_TRUE; } +#include "Renderer.h" +JSBool _lodbias(JSContext* context, JSObject* globalObject, unsigned int argc, jsval* argv, jsval* rval) +{ + g_Renderer.SetOptionFloat(CRenderer::OPT_LODBIAS, (float)g_ScriptingHost.ValueToDouble(argv[0])); + return JS_TRUE; +} + JSBool issueCommand(JSContext* context, JSObject* UNUSEDPARAM(globalObject), unsigned int argc, jsval* argv, jsval* rval) { assert(argc >= 2); diff --git a/source/scripting/ScriptGlue.h b/source/scripting/ScriptGlue.h index 2101e715e7..706717e4b0 100755 --- a/source/scripting/ScriptGlue.h +++ b/source/scripting/ScriptGlue.h @@ -76,8 +76,10 @@ JSFunc crash; // Tries to print the amount of remaining video memory. JSFunc vmem; -// You don't want to use this +// You probably don't want to use these. (If you do, give them better names +// and document them.) JSFunc _rewriteMaps; +JSFunc _lodbias; extern JSFunctionSpec ScriptFunctionTable[]; extern JSPropertySpec ScriptGlobalTable[];