Guy Joel McLean
Guy Joel McLean

Reputation: 1049

Not sure on where to define and declare my structs. (Getting undeclared identifier)

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

Answers (1)

Luchian Grigore
Luchian Grigore

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

Related Questions