summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--common/camera.cpp21
-rw-r--r--common/camera.h1
-rw-r--r--common/piece.cpp26
-rw-r--r--common/piece.h25
-rw-r--r--common/pieceinf.cpp83
-rw-r--r--common/pieceinf.h14
6 files changed, 97 insertions, 73 deletions
diff --git a/common/camera.cpp b/common/camera.cpp
index 8381cb0..8a0460f 100644
--- a/common/camera.cpp
+++ b/common/camera.cpp
@@ -210,6 +210,7 @@ void Camera::Initialize()
m_nState = 0;
m_nList = 0;
m_nType = LC_CAMERA_USER;
+ m_nList = 0;
m_pTR = NULL;
for (unsigned char i = 0 ; i < sizeof(m_strName) ; i++ )
@@ -516,10 +517,15 @@ void Camera::SelectTarget (bool bSelecting, bool bFocus, bool bMultiple)
}
}
-void Camera::UpdatePosition (unsigned short nTime, bool bAnimation)
+void Camera::UpdatePosition(unsigned short nTime, bool bAnimation)
{
- CalculateKeys (nTime, bAnimation);
+ CalculateKeys(nTime, bAnimation);
+
+ UpdateBoundingBox();
+}
+void Camera::UpdateBoundingBox()
+{
// Fix the up vector
Vector frontvec(m_fEye[0]-m_fTarget[0], m_fEye[1]-m_fTarget[1], m_fEye[2]-m_fTarget[2]);
Vector upvec(m_fUp), sidevec;
@@ -541,8 +547,8 @@ void Camera::UpdatePosition (unsigned short nTime, bool bAnimation)
m_pTarget->BoundingBoxCalculate (&mat);
mat.SetTranslation (0, 0, 0);
- if (m_nList == 0)
- m_nList = glGenLists(1);
+ if (!m_nList)
+ return;
glNewList(m_nList, GL_COMPILE);
@@ -610,6 +616,13 @@ void Camera::UpdatePosition (unsigned short nTime, bool bAnimation)
void Camera::Render(float fLineWidth)
{
+ // Create the display lists if this is the first time we're rendered.
+ if (!m_nList)
+ {
+ m_nList = glGenLists(1);
+ UpdateBoundingBox();
+ }
+
if (IsEyeSelected())
{
glLineWidth(fLineWidth*2);
diff --git a/common/camera.h b/common/camera.h
index 0e3cb2b..060086b 100644
--- a/common/camera.h
+++ b/common/camera.h
@@ -172,6 +172,7 @@ public:
protected:
void Initialize();
+ void UpdateBoundingBox();
// Camera target
CameraTarget* m_pTarget;
diff --git a/common/piece.cpp b/common/piece.cpp
index 2b304b0..df8f3b4 100644
--- a/common/piece.cpp
+++ b/common/piece.cpp
@@ -89,7 +89,6 @@ Piece::Piece(PieceInfo* pPieceInfo)
if (m_pPieceInfo != NULL)
{
- m_nBoxList = m_pPieceInfo->AddRef();
if (m_pPieceInfo->m_nConnectionCount > 0)
{
m_pConnections = (CONNECTION*)malloc(sizeof(CONNECTION)*(m_pPieceInfo->m_nConnectionCount));
@@ -132,7 +131,6 @@ Piece::~Piece()
void Piece::SetPieceInfo(PieceInfo* pPieceInfo)
{
m_pPieceInfo = pPieceInfo;
- m_nBoxList = m_pPieceInfo->AddRef();
if (m_pPieceInfo->m_nConnectionCount > 0)
{
@@ -1130,6 +1128,30 @@ void Piece::BuildDrawInfo()
}
}
+void Piece::RenderBox(bool bHilite, float fLineWidth)
+{
+ glPushMatrix();
+ glTranslatef(m_fPosition[0], m_fPosition[1], m_fPosition[2]);
+ glRotatef(m_fRotation[3], m_fRotation[0], m_fRotation[1], m_fRotation[2]);
+
+ if (bHilite && ((m_nState & LC_PIECE_SELECTED) != 0))
+ {
+ glColor3ubv(FlatColorArray[m_nState & LC_PIECE_FOCUSED ? LC_COL_FOCUSED : LC_COL_SELECTED]);
+ glLineWidth(2*fLineWidth);
+ glPushAttrib(GL_POLYGON_BIT);
+ glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+ glCallList(m_pPieceInfo->GetBoxDisplayList());
+ glPopAttrib();
+ glLineWidth(fLineWidth);
+ }
+ else
+ {
+ glColor3ubv(FlatColorArray[m_nColor]);
+ glCallList(m_pPieceInfo->GetBoxDisplayList());
+ }
+ glPopMatrix();
+}
+
void Piece::Render(bool bLighting, bool bEdges, unsigned char* nLastColor, bool* bTrans)
{
glPushMatrix();
diff --git a/common/piece.h b/common/piece.h
index 48c7f11..1bfa7a9 100644
--- a/common/piece.h
+++ b/common/piece.h
@@ -112,29 +112,7 @@ public:
{ memcpy(rotation, m_fRotation, sizeof(m_fRotation)); }
void Render(bool bLighting, bool bEdges, unsigned char* nLastColor, bool* bTrans);
- inline void RenderBox(bool bHilite, float fLineWidth)
- {
- glPushMatrix();
- glTranslatef(m_fPosition[0], m_fPosition[1], m_fPosition[2]);
- glRotatef(m_fRotation[3], m_fRotation[0], m_fRotation[1], m_fRotation[2]);
-
- if (bHilite && ((m_nState & LC_PIECE_SELECTED) != 0))
- {
- glColor3ubv(FlatColorArray[m_nState & LC_PIECE_FOCUSED ? LC_COL_FOCUSED : LC_COL_SELECTED]);
- glLineWidth(2*fLineWidth);
- glPushAttrib(GL_POLYGON_BIT);
- glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
- glCallList(m_nBoxList);
- glPopAttrib();
- glLineWidth(fLineWidth);
- }
- else
- {
- glColor3ubv(FlatColorArray[m_nColor]);
- glCallList(m_nBoxList);
- }
- glPopMatrix();
- }
+ void RenderBox(bool bHilite, float fLineWidth);
inline bool IsTransparent()
{
@@ -169,7 +147,6 @@ protected:
// Temporary variables
float m_fPosition[3];
float m_fRotation[4];
- GLuint m_nBoxList;
CONNECTION* m_pConnections;
void* m_pDrawInfo;
};
diff --git a/common/pieceinf.cpp b/common/pieceinf.cpp
index a31d414..eee37e4 100644
--- a/common/pieceinf.cpp
+++ b/common/pieceinf.cpp
@@ -217,6 +217,7 @@ void PieceInfo::LoadIndex (File& file)
m_pGroups = NULL;
m_nTextureCount = 0;
m_pTextures = NULL;
+ m_nBoxList = 0;
file.Read (m_strName, 8);
m_strName[8] = '\0';
@@ -243,7 +244,7 @@ void PieceInfo::LoadIndex (File& file)
m_fDimensions[5] = (float)sh[5]/scale;
}
-GLuint PieceInfo::AddRef()
+void PieceInfo::AddRef()
{
if (m_nRef == 0)
LoadInformation();
@@ -253,8 +254,6 @@ GLuint PieceInfo::AddRef()
if (m_pTextures[i].texture != NULL)
m_pTextures[i].texture->AddRef(false);
// TODO: get correct filter paramenter
-
- return m_nBoxList;
}
void PieceInfo::DeRef()
@@ -268,6 +267,49 @@ void PieceInfo::DeRef()
FreeInformation();
}
+void PieceInfo::CreateBoxDisplayList()
+{
+ if (m_nBoxList)
+ return;
+
+ // Create a display for the bounding box.
+ m_nBoxList = glGenLists(1);
+ glNewList(m_nBoxList, GL_COMPILE);
+ glEnableClientState(GL_VERTEX_ARRAY);
+
+ float box[24][3] =
+ {
+ { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] },
+ { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] },
+ { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] },
+ { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] },
+ { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] },
+ { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] },
+ { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] },
+ { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] },
+ { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] },
+ { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] },
+ { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] },
+ { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] },
+ { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] },
+ { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] },
+ { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] },
+ { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] },
+ { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] },
+ { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] },
+ { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] },
+ { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] },
+ { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] },
+ { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] },
+ { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] },
+ { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] }
+ };
+
+ glVertexPointer(3, GL_FLOAT, 0, box);
+ glDrawArrays(GL_QUADS, 0, 24);
+ glEndList();
+}
+
void PieceInfo::LoadInformation()
{
FileDisk bin;
@@ -285,41 +327,6 @@ void PieceInfo::LoadInformation()
// We don't want memory leaks.
FreeInformation ();
- // Create a display for the bounding box.
- m_nBoxList = glGenLists(1);
- glNewList(m_nBoxList, GL_COMPILE);
- glEnableClientState(GL_VERTEX_ARRAY);
-
- float box[24][3] = {
- { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] },
- { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] },
- { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] },
- { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] },
- { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] },
- { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] },
- { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] },
- { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] },
- { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] },
- { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] },
- { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] },
- { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] },
- { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] },
- { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] },
- { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] },
- { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] },
- { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] },
- { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] },
- { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] },
- { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] },
- { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] },
- { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] },
- { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] },
- { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] }
- };
- glVertexPointer (3, GL_FLOAT, 0, box);
- glDrawArrays (GL_QUADS, 0, 24);
- glEndList ();
-
// Open pieces.bin and buffer the information we need.
strcpy (filename, lcGetPiecesLibrary()->GetLibraryPath());
strcat (filename, "pieces.bin");
diff --git a/common/pieceinf.h b/common/pieceinf.h
index c6856ec..56892c8 100644
--- a/common/pieceinf.h
+++ b/common/pieceinf.h
@@ -87,8 +87,14 @@ class PieceInfo
void WriteWavefront(FILE* file, unsigned char color, unsigned long* start);
// Implementation
- void LoadIndex (File& file);
- GLuint AddRef();
+ GLuint GetBoxDisplayList()
+ {
+ if (!m_nBoxList)
+ CreateBoxDisplayList();
+ return m_nBoxList;
+ };
+ void LoadIndex(File& file);
+ void AddRef();
void DeRef();
public:
@@ -116,9 +122,7 @@ protected:
void LoadInformation();
void FreeInformation();
-/*
- CRModel* m_pRModel;
-*/
+ void CreateBoxDisplayList();
};
#endif // _PIECEINF_H_