Advertisement

What am I doing wrong?

Started by July 07, 2001 10:55 AM
3 comments, last by Rottbott 23 years, 5 months ago
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];
};
// 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
You are trying to store three values into arrays that only hold two. Try changing VertexX[2], etc to VertexX[3].
Advertisement
Don''t they start at [0]?


Rottbott
Well yes..

VertexX[2] holds two values: VertexX[0] & VertexX[1]
-------------Ban KalvinB !
Aaaaah... NOW I get it! Thanks very much! It all works now except some horrific floating point inaccuracies.


Rottbott

This topic is closed to new replies.

Advertisement