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:
Ykkrosh 2005-05-20 17:09:47 +00:00
parent 409675eb44
commit 0331883a86
12 changed files with 79 additions and 52 deletions

View File

@ -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;

View File

@ -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());
}
}

View File

@ -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);

View File

@ -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)

View File

@ -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();
}

View File

@ -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

View File

@ -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;

View File

@ -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();
}

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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[];