1 /** \file gameengine/Expressions/VectorValue.cpp
4 // VectorValue.cpp: implementation of the CVectorValue class.
6 * Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
8 * Permission to use, copy, modify, distribute and sell this software
9 * and its documentation for any purpose is hereby granted without fee,
10 * provided that the above copyright notice appear in all copies and
11 * that both that copyright notice and this permission notice appear
12 * in supporting documentation. Erwin Coumans makes no
13 * representations about the suitability of this software for any
14 * purpose. It is provided "as is" without express or implied warranty.
18 #if defined(WIN32) && !defined(FREE_WINDOWS)
19 #pragma warning (disable:4786)
23 #include "VectorValue.h"
24 #include "ErrorValue.h"
25 //#include "MatrixValue.h"
26 #include "VoidValue.h"
27 #include "StringValue.h"
28 //#include "FactoryManager.h"
32 //////////////////////////////////////////////////////////////////////
33 // Construction/Destruction
34 //////////////////////////////////////////////////////////////////////
36 CVectorValue::CVectorValue(float x,float y,float z, AllocationTYPE alloctype)
38 SetCustomFlag1(false);//FancyOutput=false;
40 if (alloctype == STACKVALUE)
42 CValue::DisableRefCount();
45 m_vec[KX_X] = m_transformedvec[KX_X] = x;
46 m_vec[KX_Y] = m_transformedvec[KX_Y] = y;
47 m_vec[KX_Z] = m_transformedvec[KX_Z] = z;
50 CVectorValue::CVectorValue(double vec[],const char *name,AllocationTYPE alloctype) {
52 SetCustomFlag1(false);//FancyOutput=false;
54 m_vec[KX_X] = m_transformedvec[KX_X] = vec[KX_X];
55 m_vec[KX_Y] = m_transformedvec[KX_Y] = vec[KX_Y];
56 m_vec[KX_Z] = m_transformedvec[KX_Z] = vec[KX_Z];
58 if (alloctype == STACKVALUE)
60 CValue::DisableRefCount();
67 CVectorValue::CVectorValue(double vec[],AllocationTYPE alloctype) {
69 SetCustomFlag1(false);//FancyOutput=false;
71 m_vec[KX_X] = m_transformedvec[KX_X] = vec[KX_X];
72 m_vec[KX_Y] = m_transformedvec[KX_Y] = vec[KX_Y];
73 m_vec[KX_Z] = m_transformedvec[KX_Z] = vec[KX_Z];
75 if (alloctype == STACKVALUE)
77 CValue::DisableRefCount();
83 CVectorValue::~CVectorValue()
88 CValue* CVectorValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val)
90 pre: the type of val is dtype
91 ret: a new object containing the result of applying operator op to val and
99 case VALUE_ADD_OPERATOR:
103 case VALUE_EMPTY_TYPE:
104 case VALUE_VECTOR_TYPE:
106 ret = new CVectorValue(
107 val->GetVector3()[KX_X] + GetVector3()[KX_X],
108 val->GetVector3()[KX_Y] + GetVector3()[KX_Y],
109 val->GetVector3()[KX_Z] + GetVector3()[KX_Z],
111 ret->SetName(GetName());
116 ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
120 case VALUE_MUL_OPERATOR:
125 case VALUE_EMPTY_TYPE:
126 case VALUE_VECTOR_TYPE:
128 //MT_Vector3 supports 'scaling' by another vector, instead of using general transform, Gino?
129 //ret = new CVectorValue(val->GetVector3().Scaled(GetVector3()),GetName());
132 case VALUE_FLOAT_TYPE:
134 ret = new CVectorValue(
135 val->GetVector3()[KX_X] * GetVector3()[KX_X],
136 val->GetVector3()[KX_Y] * GetVector3()[KX_Y],
137 val->GetVector3()[KX_Z] * GetVector3()[KX_Z],
139 ret->SetName(GetName());
144 ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
151 ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
158 double CVectorValue::GetNumber()
164 double* CVectorValue::GetVector3(bool bGetTransformedVec)
166 if (bGetTransformedVec)
167 return m_transformedvec;
176 void CVectorValue::SetVector(double newvec[])
178 m_vec[KX_X] = m_transformedvec[KX_X] = newvec[KX_X];
179 m_vec[KX_Y] = m_transformedvec[KX_Y] = newvec[KX_Y];
180 m_vec[KX_Z] = m_transformedvec[KX_Z] = newvec[KX_Z];
186 void CVectorValue::SetValue(CValue *newval)
189 double* newvec = ((CVectorValue*)newval)->GetVector3();
190 m_vec[KX_X] = m_transformedvec[KX_X] = newvec[KX_X];
191 m_vec[KX_Y] = m_transformedvec[KX_Y] = newvec[KX_Y];
192 m_vec[KX_Z] = m_transformedvec[KX_Z] = newvec[KX_Z];
197 static const STR_String gstrVectorStr=STR_String();
198 const STR_String & CVectorValue::GetText()
201 return gstrVectorStr;
204 CValue* CVectorValue::GetReplica() {
205 CVectorValue* replica = new CVectorValue(*this);
206 replica->ProcessReplica();
210 /*void CVectorValue::Transform(rcMatrix4x4 mat)
212 m_transformedvec = mat*m_vec;