#define MAX_OBJECTS 10
#include
#include
// Function prototypes
unsigned int CreateNewObject(unsigned int, unsigned int);
void SetObjectTriangleVertex(unsigned int, unsigned int, unsigned int,
float, float, float);
void SetObjectQuadVertex(unsigned int, unsigned int, unsigned int,
float, float, float);
// Structures to hold object information etc
// Triangle polygon vertices
class TrianglePol
{
public:
float VertexX[2], VertexY[2], VertexZ[2];
};
// Quad polygon vertices
class QuadPol
{
public:
float VertexX[3], VertexY[3], VertexZ[3];
};
// Object position/polygon/settings info
struct
{
unsigned int Triangles, Quads;
TrianglePol * pTriangles;
QuadPol * pQuads;
float PosX, PosY, PosZ, RotX, RotY, RotZ;
bool Cull, Wireframe, Visible, InUse;
} Object[MAX_OBJECTS];
// Unused object array to prevent searching for them
unsigned int CurrentUnusedObjs = MAX_OBJECTS;
unsigned int UnusedObjs[MAX_OBJECTS];
// Main function
int main(int argc, char *argv[])
{
// Fill 'unused objects' array for object creation
for(unsigned int i = 0; i <= MAX_OBJECTS; i++)
{
UnusedObjs = i;
}
// Make example triangle object
unsigned int Triangle = CreateNewObject(1, 0);
SetObjectTriangleVertex(Triangle, 0, 0, -5, -5, 0);
SetObjectTriangleVertex(Triangle, 0, 1, 5, -5, 0);
SetObjectTriangleVertex(Triangle, 0, 2, 0, 5, 0);
// This _should_ print the values above /\ ... except some of them are wrong. Why?
TrianglePol * pTPointer = Object[Triangle].pTriangles;
cout << "XYZ: " << pTPointer->VertexX[0] << ", " << pTPointer->VertexY[0] << ", " << pTPointer->VertexZ[0] << "\n";
cout << "XYZ: " << pTPointer->VertexX[1] << ", " << pTPointer->VertexY[1] << ", " << pTPointer->VertexZ[1] << "\n";
cout << "XYZ: " << pTPointer->VertexX[2] << ", " << pTPointer->VertexY[2] << ", " << pTPointer->VertexZ[2] << "\n";
// End program
system("PAUSE");
return 0;
}
// Function to create a new object
unsigned int CreateNewObject(unsigned int Triangles, unsigned int Quads)
{
unsigned int Obj = UnusedObjs[CurrentUnusedObjs];
CurrentUnusedObjs -= 1;
Object[Obj].PosX = 0;
Object[Obj].PosY = 0;
Object[Obj].PosZ = 0;
Object[Obj].RotX = 0;
Object[Obj].RotY = 0;
Object[Obj].Wireframe = false;
Object[Obj].Cull = true;
Object[Obj].Visible = true;
Object[Obj].Triangles = Triangles;
Object[Obj].Quads = Quads;
// Make triangles
if (Triangles > 0) Object[Obj].pTriangles = new TrianglePol[Triangles - 1];
// Make quads
if (Quads > 0) Object[Obj].pQuads = new QuadPol[Quads - 1];
return Obj;
}
// Functions to set a vertex position
void SetObjectTriangleVertex(unsigned int Obj, unsigned int Tri,
unsigned int Vertex, float x, float y, float z)
{
// Error checking
if (Obj > MAX_OBJECTS)
{
//CloseOnError("Object does not exist");
return;
}
if (Tri > Object[Obj].Triangles - 1)
{
//CloseOnError("Triangle does not exist");
return;
}
if (Vertex > 2 || Vertex < 0)
{
//CloseOnError("Vertex does not exist");
return;
}
TrianglePol * pPointer = Object[Obj].pTriangles;
pPointer += Tri;
pPointer->VertexX[Vertex] = x;
pPointer->VertexY[Vertex] = y;
pPointer->VertexZ[Vertex] = z;
}
// Function to set the position of a quad vertex
void SetObjectQuadVertex(unsigned int Obj, unsigned int Qua,
unsigned int Vertex, float x, float y, float z)
{
// Error checking
if (Obj > MAX_OBJECTS)
{
//CloseOnError("Object does not exist");
return;
}
if (Qua > Object[Obj].Quads - 1)
{
//CloseOnError("Quad does not exist");
return;
}
if (Vertex > 3 || Vertex < 0)
{
//CloseOnError("Vertex does not exist");
return;
}
QuadPol * pPointer = Object[Obj].pQuads;
pPointer += (Qua);
pPointer->VertexX[Vertex] = x;
pPointer->VertexY[Vertex] = y;
pPointer->VertexZ[Vertex] = z;
}
The code isn't all that clear, but here's the basic idea:
The struct-array 'Object[]' holds all the info for the 3D object, including two pointers to new objects of the triangle-polygon and quad-polygon classes. Each object has an unspecified amount of each of these - my example is creating an object with one triangle and 0 quads.
BTW, I've not put code in there yet to clean up the objects... sorry! It will create a tiny memory leak I think.
Rottbott
Edited by - Rottbott on July 7, 2001 12:04:52 PM
What am I doing wrong?
Hi,
I've got some data structures to hold object/vertex information in my OpenGL library, but I noticed that sometimes I got some strange values, and vertices were in the wrong place. I guessed it was my C++ knowledge lacking, so I extracted the relevant code and made a simple console app to test only the bits that were buggy. Now I have a little source file which just prints 9 numbers - and a few of them are wrong. I can't see why.
It's probably easier to explain just by posting the code. If you can see something I've done wrong, please help me fix it .
You are trying to store three values into arrays that only hold two. Try changing VertexX[2], etc to VertexX[3].
Well yes..
VertexX[2] holds two values: VertexX[0] & VertexX[1]
VertexX[2] holds two values: VertexX[0] & VertexX[1]
-------------Ban KalvinB !
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement