• FEATURED

View more

View more

View more

### Image of the Day Submit

IOTD | Top Screenshots

### The latest, straight to your Inbox.

Subscribe to GameDev.net Direct to receive the latest updates and exclusive content.

# What am I doing wrong?

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

4 replies to this topic

### #1Rottbott  Members

Posted 07 July 2001 - 04:55 AM

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 .
#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];
};
{
public:
float VertexX[3], VertexY[3], VertexZ[3];
};
// Object position/polygon/settings info
struct
{
TrianglePol * pTriangles;
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;
// Make triangles
if (Triangles > 0) Object[Obj].pTriangles = new TrianglePol[Triangles - 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)
{
return;
}
if (Vertex > 3 || Vertex < 0)
{
//CloseOnError("Vertex does not exist");
return;
}
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

### #2CheeseGrater  Members

Posted 07 July 2001 - 06:02 AM

You are trying to store three values into arrays that only hold two. Try changing VertexX[2], etc to VertexX[3].

### #3Rottbott  Members

Posted 07 July 2001 - 06:08 AM

Don''t they start at [0]?

Rottbott

### #4granat  Members

Posted 07 July 2001 - 06:11 AM

Well yes..

VertexX[2] holds two values: VertexX[0] & VertexX[1]

### #5Rottbott  Members

Posted 07 July 2001 - 06:23 AM

Aaaaah... NOW I get it! Thanks very much! It all works now except some horrific floating point inaccuracies.

Rottbott

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.