Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


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.

  • You cannot reply to this topic
4 replies to this topic

#1 Rottbott   Members   -  Reputation: 145

Like
Likes
Like

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];
};
// 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

Sponsor:

#2 CheeseGrater   Members   -  Reputation: 122

Like
Likes
Like

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].

#3 Rottbott   Members   -  Reputation: 145

Like
Likes
Like

Posted 07 July 2001 - 06:08 AM

Don''t they start at [0]?


Rottbott

#4 granat   Members   -  Reputation: 122

Like
Likes
Like

Posted 07 July 2001 - 06:11 AM

Well yes..

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

#5 Rottbott   Members   -  Reputation: 145

Like
Likes
Like

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.



PARTNERS