Vector3 Undeclared

Started by
7 comments, last by me22 18 years, 5 months ago
#ifndef	GL_RENDERER_H
#define	GL_RENDERER_H

#include <vector>

using namespace std;

struct	BasicQuad
{
	Vector3 P1, P2, P3, P4;
	int	Texture;//Index into gpTextureManager
};

std::vector<BasicQuad*>	mBasicQuads;

class GLRenderer
{
public:
	GLRenderer()
	{

	}

	
	void	AddBasicQuadToRenderer(float P1X,float  P1Y,float	P1Z,
								   float P2X,float	P2Y,float	P2Z,
								   float P3X,float	P3Y,float	P3Z,
								   float P4X,float	P4Y,float	P4Z,
								   int	Texture)
	{
		BasicQuad	*pData = new	BasicQuad;
		pData->P1	=	Vector3(P1X,P1Y,P1Z);
		pData->P2	=	Vector3(P2X,P2Y,P2Z);
		pData->P3	=	Vector3(P3X,P3Y,P3Z);
		pData->P4	=	Vector3(P4X,P4Y,P4Z);
		pData->Texture	=	Texture;
		mBasicQuads.push_back(pData);
	}
};



#endif
Do I need to declare vector3 myself? is there a header file? How would I declare vector3?
----------------------------------------------------------Rating me down will only make me stronger.----------------------------------------------------------
Advertisement
You need to #include the file that Vector3 is declared in.
That vector include you have is not what you think. It is for the vector data structure (similar to a linked-list).

I'm not sure if Vector3 is defined anyhere, but it's easy enough to write your own. (I'm working without a compiler here so forgive any syntax mistakes)

For starters you could just do a tyopedef:
typedef float[3] Vector3


But you probably want to create a class:
class Vector3{  float x;  float y;  float z;  Vector3();  Vector3(float a_x, float a_y, float a_z);// And so on};


Hope that helps!
Matt
__________________________________[ Website ] [ Résumé ] [ [email=contact[at]matthughson[dot]com]Contact[/email] ][ Have I been Helpful? Hook me up! ]
#include <vector>


shouldnt that be vector.h?

I'm not sure because its a while since I did any C++, but its worth a try
JUST-CODE-IT.NETManaged DirectX & C# TutorialsForumsArticlesLinksSamples
Quote:Original post by Xpyder
#include <vector>


shouldnt that be vector.h?

I'm not sure because its a while since I did any C++, but its worth a try


Nope. Header files in C++ generally don't use the .h suffix - well at least the ones that are part of the language, feel free to use .h in your own files. In addition, if you want to use header files from C do it like this:

// don't do it this way#include <stdlib.h>#include <stdio.h"// do it this way#include <cstdlib>#include <cstdio>


As mentioned above, there's a difference between std::vector, which is part of the Standard Library, and Vector3 which isn't part of the language. Writing your own Vector3 shouldn't be too tough.
WOOT, this worked, finally, I have a working AddBasicQuadToRenderer function!

#include <vector>using namespace std;class Vector3{public:  float x;  float y;  float z;  Vector3();  Vector3(float a_x, float a_y, float a_z);// And so on};struct	BasicQuad{	Vector3 P1, P2, P3, P4;	int	Texture;//Index into gpTextureManager};std::vector<BasicQuad*>	mBasicQuads;class GLRenderer{public:	GLRenderer()	{	}		void	AddBasicQuadToRenderer(float P1X,float  P1Y,float	P1Z,								   float P2X,float	P2Y,float	P2Z,								   float P3X,float	P3Y,float	P3Z,								   float P4X,float	P4Y,float	P4Z,								   int	Texture)	{		BasicQuad	*pData = new	BasicQuad;		pData->P1	=	Vector3(P1X,P1Y,P1Z);		pData->P2	=	Vector3(P2X,P2Y,P2Z);		pData->P3	=	Vector3(P3X,P3Y,P3Z);		pData->P4	=	Vector3(P4X,P4Y,P4Z);		pData->Texture	=	Texture;		mBasicQuads.push_back(pData);	}};



Kept it simple, rewrote it, now it looks like this
class Vector3{public:   Vector3()  {  }  Vector3(float x, float y, float z);};
----------------------------------------------------------Rating me down will only make me stronger.----------------------------------------------------------
Next you'll want to add operator overloads to your Vector3 class, ie. provide functions to perform addition, subtraction, etc. These will allow you to work with the vector more 'naturally'.

For example:
Vector3 operator+(const Vector3& lhs, const Vector3& rhs){    Vector3 result;    result.x = lhs.x + rhs.x;    result.y = lhs.y + rhs.y;    result.z = lhs.z + rhs.z;    return result;}void test(){    Vector3 a(1,2,3);    Vector3 b(4,5,6);    a = a + b;    // Now a==(5,7,9)}

"Voilà! In view, a humble vaudevillian veteran, cast vicariously as both victim and villain by the vicissitudes of Fate. This visage, no mere veneer of vanity, is a vestige of the vox populi, now vacant, vanished. However, this valorous visitation of a bygone vexation stands vivified, and has vowed to vanquish these venal and virulent vermin vanguarding vice and vouchsafing the violently vicious and voracious violation of volition. The only verdict is vengeance; a vendetta held as a votive, not in vain, for the value and veracity of such shall one day vindicate the vigilant and the virtuous. Verily, this vichyssoise of verbiage veers most verbose, so let me simply add that it's my very good honor to meet you and you may call me V.".....V
Ah I see, to perform like, matrix operations n stuff... for axis and stuff, cool :d
----------------------------------------------------------Rating me down will only make me stronger.----------------------------------------------------------
I just wrote this one yesterday, if anyone's interested:
#ifndef MATH_VECTOR_HPP#define MATH_VECTOR_HPP/* * math/vector.hpp - Generic N-ary vector * * Copyright (c) 2005 Scott McMurray ( me22@users.sf.net ) * * Distributed under the Boost Software License, Version 1.0. * ( See http://www.boost.org/LICENSE_1_0.txt ) * */#include <cstddef>#include <algorithm>#include <functional>#include <numeric>namespace math {template < unsigned N = 3, typename T = float >class vector {    T v_[N];  public:    typedef T value_type;    typedef value_type const const_value_type;    typedef value_type& reference;    typedef const_value_type& const_reference;    typedef value_type* pointer;    typedef const_value_type* const_pointer;    typedef std::size_t size_type;    typedef std::ptrdiff_t difference_type;    typedef const_value_type parameter_type;    vector() {        std::fill_n( v_, N, 0 );    }    explicit vector(parameter_type x) {        std::fill_n( v_, N, x );    }    vector(parameter_type x, parameter_type y) {        v_[0] = x; if ( N > 1 )        v_[1] = y;    }    vector(parameter_type x, parameter_type y, parameter_type z) {        v_[0] = x; if ( N > 1 )        v_[1] = y; if ( N > 2 )        v_[2] = z;    }    explicit vector(const_pointer p, size_type n = N) {        if ( n > N ) n = N;        copy( p, p+n,              v_ );        fill_n( v_+n, N-n, 0 );    }    const_pointer v() const {        return v_;    }    pointer v() {        return const_cast<pointer>(                const_cast<vector const &>(*this).v()               );    }    static size_type size() {        return N;    }    const_reference operator[](size_type i) const {        assert( i < N && "=> index out of range" );        return v_;    }    reference operator[](size_type i) {        return const_cast<reference>(                const_cast<vector const &>(*this).operator[](i)               );    }    vector &operator+=(vector const &vec) {        std::transform( v(), v()+size(),                        vec.v(),                        v(),                        std::plus<T>() );        return *this;    }    vector &operator-=(vector const &vec) {        std::transform( v(), v()+size(),                        vec.v(),                        v(),                        std::minus<T>() );        return *this;    }    vector &operator*=(parameter_type c) {        std::transform( v(), v()+size(),                        v(),                        std::bind2nd( std::multiplies<T>(), c ) );        return *this;    }    vector &operator/=(parameter_type c) {        return operator*=( 1 / c );    }};template < unsigned N, typename T >bool operator==(vector<N,T> const &lhs, vector<N,T> const &rhs) {    return std::equal( lhs.v(), lhs.v()+N,                       rhs.v() );}template < unsigned N, typename T >bool operator!=(vector<N,T> const &lhs, vector<N,T> const &rhs) {    return !( lhs == rhs );}template < unsigned N, typename T >vector<N,T> operator+(vector<N,T> lhs, vector<N,T> const &rhs) {    return lhs += rhs;}template < unsigned N, typename T >vector<N,T> operator-(vector<N,T> lhs, vector<N,T> const &rhs) {    return lhs -= rhs;}template < unsigned N, typename T >vector<N,T> operator*(vector<N,T> vec,                      typename vector<N,T>::parameter_type c) {    return vec*=c;}template < unsigned N, typename T >vector<N,T> operator*(typename vector<N,T>::parameter_type c,                      vector<N,T> vec) {    return vec*=c;}template < unsigned N, typename T >vector<N,T> operator/(vector<N,T> vec,                      typename vector<N,T>::parameter_type c) {    return vec/=c;}template < unsigned N, typename T >vector<N,T> operator-(vector<N,T> const &vec) {    return vec * -1;}template < unsigned N, typename T >T dot(vector<N,T> lhs, vector<N,T> const &rhs) {    return std::inner_product( lhs.v(), lhs.v()+N,                               rhs.v(),                               static_cast<T>(0) );}template < typename T >T cross(vector<2,T> const &lhs, vector<2,T> const &rhs) {    return lhs[0]*rhs[1]-lhs[1]*rhs[0];}template < typename T >vector<3,T> cross(vector<3,T> const &lhs, vector<3,T> const &rhs) {    return vector<3,T>( lhs[1]*rhs[2]-lhs[2]*rhs[1],                        lhs[2]*rhs[0]-lhs[0]*rhs[2],                        lhs[0]*rhs[1]-lhs[1]*rhs[0] );}// Note: norm == length*lengthtemplate < unsigned N, typename T >T norm(vector<N,T> const &vec) {    return dot( vec, vec );}} // namespace math#endif


you could always typedef math::vector<3,float> Vector3 :P

Note that it's functional, but not optimized. I just used the std algorithms to get it working and testable. It might benefit from some template unrolling in the dot products and such, although a compiler might be able to do that itself...

This topic is closed to new replies.

Advertisement