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.
This commit is contained in:
parent
409675eb44
commit
0331883a86
@ -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;
|
||||
|
@ -164,6 +164,7 @@ void CGameView::RenderModels(CUnitManager *pUnitMan, CProjectileManager *pProjec
|
||||
const std::vector<CUnit*>& units=pUnitMan->GetUnits();
|
||||
for (uint i=0;i<units.size();++i) {
|
||||
if (frustum.IsBoxVisible(CVector3D(0,0,0),units[i]->GetModel()->GetBounds())) {
|
||||
PROFILE( "submit models" );
|
||||
SubmitModelRecursive(units[i]->GetModel());
|
||||
}
|
||||
}
|
||||
@ -171,6 +172,7 @@ void CGameView::RenderModels(CUnitManager *pUnitMan, CProjectileManager *pProjec
|
||||
const std::vector<CProjectile*>& projectiles=pProjectileMan->GetProjectiles();
|
||||
for (uint i=0;i<projectiles.size();++i) {
|
||||
if (frustum.IsBoxVisible(CVector3D(0,0,0),projectiles[i]->GetModel()->GetBounds())) {
|
||||
PROFILE( "submit projectiles" );
|
||||
SubmitModelRecursive(projectiles[i]->GetModel());
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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; j<numVertices; j++) {
|
||||
SkinPoint(vertices[j],bonematrices,m_Vertices[j].m_Position);
|
||||
@ -168,12 +170,14 @@ void CModelRData::BuildVertices()
|
||||
}
|
||||
}
|
||||
|
||||
PROFILE_START( "lighting vertices" );
|
||||
// now fill in UV and vertex colour data
|
||||
for (uint j=0; j<numVertices; j++) {
|
||||
m_Vertices[j].m_UVs[0]=vertices[j].m_U;
|
||||
m_Vertices[j].m_UVs[1]=1-vertices[j].m_V;
|
||||
g_Renderer.m_SHCoeffsUnits.Evaluate(m_Normals[j],m_Vertices[j].m_Color);
|
||||
}
|
||||
PROFILE_END( "lighting vertices" );
|
||||
|
||||
// upload everything to vertex buffer - create one if necessary
|
||||
if (!m_VB) {
|
||||
@ -367,9 +371,11 @@ void CModelRData::Submit(CModel* model)
|
||||
CModelRData* data=(CModelRData*) model->GetRenderData();
|
||||
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();
|
||||
}
|
||||
|
||||
|
@ -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;i<m_Objects.size();++i) {
|
||||
if (!mflags || (m_Objects[i].m_Model->GetFlags() & 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
|
||||
|
@ -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<SObject> m_Objects;
|
||||
// list of objects to render
|
||||
std::vector<CModel*> m_Objects;
|
||||
};
|
||||
|
||||
extern CPlayerRenderer g_PlayerRenderer;
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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[];
|
||||
|
Loading…
Reference in New Issue
Block a user