Reputation: 1049
I believe that this is an issue of scope. All of my attempts to pass either pointers-to or the actual structs (GLface or GLpoint) are giving me undeclared identifier errors.
However both structs are clearly defined in the .h file.
NormalCalulator.h
#pragma once
#include <vector>
#include <GL/glut.h>
class NormalCalculator
{
struct GLpoint
{
GLfloat x,y,z;
};
struct GLface
{
GLfloat x1,y1,z1,x2,y2,z2,x3,y3,z3;
};
public:
NormalCalculator::NormalCalculator(void);
NormalCalculator::~NormalCalculator(void);
//put all of the face normal functions together
void NormalCalculator::generateFaceNormals(std::vector<GLfloat>* vertexArray, std::vector<GLubyte>* indexArray, std::vector<GLfloat>* normalArray);
private:
//creates the line vectors from the the 3 points passed in as a part of the GLface
void NormalCalculator::createLineVectorsFromFace(GLface facePassedIn, GLpoint* l_vec1, GLpoint* l_vec2);
//generates a normal vector for the 2 line vectors made by createLineVectorsFromFace
void NormalCalculator::crossProductOfVecs(GLpoint* l_vec1, GLpoint* l_vec2, GLpoint* outPutNormal);
//alters the normal vector so that it is of Unit length
bool NormalCalculator::normalizeVector(GLpoint* normalVector, GLpoint* normalizedNormalVecContainer);
GLpoint NormalCalculator::computeFaceNormal(GLface faceToNormal);
};
and the NormalCalculator.cpp is as follows.
According to the compiler the errors begin at my passing of GLface to the function createLineVectorsFromFace. And in case anybody was wondering, the fact the GLface is passed as an object and not a pointer to a GLface is intentional.
#include "NormalCalculator.h"
#include <gl/glut.h>
#include <math.h>
#include <iostream>
void createLineVectorsFromFace( GLface facePassedIn, GLpoint* l_vec1, GLpoint* l_vec2)
{
//from verts 1 & 2 initialize l_vec1
l_vec1->x = facePassedIn.x1 - facePassedIn.x2;
l_vec1->y = facePassedIn.y1 - facePassedIn.y2;
l_vec1->z = facePassedIn.z1 - facePassedIn.z2;
//do that same for l_vec2 from face 2 and 3
l_vec2->x = facePassedIn.x2 - facePassedIn.x3;
l_vec2->y = facePassedIn.y2 - facePassedIn.y3;
l_vec2->z = facePassedIn.z2 - facePassedIn.z3;
}
void crossProductOfVecs(GLpoint* l_vec1, GLpoint* l_vec2, GLpoint* outPutNormal)
{
//cross product dat hoe
outPutNormal->x = (l_vec1->y * l_vec2->z) - (l_vec1->z * l_vec2->y);//x = aybz-byaz
outPutNormal->y = (l_vec1->z * l_vec2->x) - (l_vec1->x - l_vec2->z);//y = azbx-bzax
outPutNormal->z = (l_vec1->x * l_vec2->y) - (l_vec1->y - l_vec2->x);//z = axby-bxay
}
bool NormalCalculator::normalizeVector(GLpoint* normalVector, GLpoint* normalizedNormalVecContainer)
{
//first we must work out the magnitude of the normal vector
GLfloat mag = (sqrt((float) pow(normalVector->x,2) + pow(normalVector->y,2) + pow(normalVector->z,2)));
if(mag)
{
normalizedNormalVecContainer->x = normalVector->x/mag;
normalizedNormalVecContainer->y = normalVector->y/mag;
normalizedNormalVecContainer->z = normalVector->z/mag;
return true;
}
else return false;
}
GLpoint NormalCalculator::computeFaceNormal(GLface faceToNormal)
{
//first we create a couple of container GLpoints for our 2 line vectors
GLpoint a;
GLpoint b;
createLineVectorsFromFace(faceToNormal, &a, &b);
//Create a container for our origional normal
GLpoint firstNorm;
//We have our line vectors, and a container. Now cross product them and put them in the container.
crossProductOfVecs(&a, &b, &firstNorm);
//create out last normal container
GLpoint finalNorm;
//normalize it
normalizeVector(&firstNorm, &finalNorm);
return finalNorm;
}
NormalCalculator::NormalCalculator(void)
{
}
NormalCalculator::~NormalCalculator(void)
{
}
This is just a wild guess, but do I need to do something with typedef?
Upvotes: 0
Views: 149
Reputation: 258638
void createLineVectorsFromFace( ....
is not the same as
void NormalCalculator::createLineVectorsFromFace( ....
The compiler is right (as usual), you didn't define the member, you defined a free function.
Same goes for crossProductOfVecs
.
Upvotes: 3