1 // VectorValue.cpp: implementation of the CVectorValue class.
3 * Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
5 * Permission to use, copy, modify, distribute and sell this software
6 * and its documentation for any purpose is hereby granted without fee,
7 * provided that the above copyright notice appear in all copies and
8 * that both that copyright notice and this permission notice appear
9 * in supporting documentation. Erwin Coumans makes no
10 * representations about the suitability of this software for any
11 * purpose. It is provided "as is" without express or implied warranty.
15 #if defined(WIN32) && !defined(FREE_WINDOWS)
16 #pragma warning (disable:4786)
20 #include "VectorValue.h"
21 #include "ErrorValue.h"
22 //#include "MatrixValue.h"
23 #include "VoidValue.h"
24 #include "StringValue.h"
25 //#include "FactoryManager.h"
29 //////////////////////////////////////////////////////////////////////
30 // Construction/Destruction
31 //////////////////////////////////////////////////////////////////////
33 CVectorValue::CVectorValue(float x,float y,float z, AllocationTYPE alloctype)
35 SetCustomFlag1(false);//FancyOutput=false;
37 if (alloctype == STACKVALUE)
39 CValue::DisableRefCount();
42 m_vec[KX_X] = m_transformedvec[KX_X] = x;
43 m_vec[KX_Y] = m_transformedvec[KX_Y] = y;
44 m_vec[KX_Z] = m_transformedvec[KX_Z] = z;
47 CVectorValue::CVectorValue(double vec[],const char *name,AllocationTYPE alloctype) {
49 SetCustomFlag1(false);//FancyOutput=false;
51 m_vec[KX_X] = m_transformedvec[KX_X] = vec[KX_X];
52 m_vec[KX_Y] = m_transformedvec[KX_Y] = vec[KX_Y];
53 m_vec[KX_Z] = m_transformedvec[KX_Z] = vec[KX_Z];
55 if (alloctype == STACKVALUE)
57 CValue::DisableRefCount();
64 CVectorValue::CVectorValue(double vec[],AllocationTYPE alloctype) {
66 SetCustomFlag1(false);//FancyOutput=false;
68 m_vec[KX_X] = m_transformedvec[KX_X] = vec[KX_X];
69 m_vec[KX_Y] = m_transformedvec[KX_Y] = vec[KX_Y];
70 m_vec[KX_Z] = m_transformedvec[KX_Z] = vec[KX_Z];
72 if (alloctype == STACKVALUE)
74 CValue::DisableRefCount();
80 CVectorValue::~CVectorValue()
85 CValue* CVectorValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val)
87 pre: the type of val is dtype
88 ret: a new object containing the result of applying operator op to val and
96 case VALUE_ADD_OPERATOR:
100 case VALUE_EMPTY_TYPE:
101 case VALUE_VECTOR_TYPE:
103 ret = new CVectorValue(
104 val->GetVector3()[KX_X] + GetVector3()[KX_X],
105 val->GetVector3()[KX_Y] + GetVector3()[KX_Y],
106 val->GetVector3()[KX_Z] + GetVector3()[KX_Z],
108 ret->SetName(GetName());
113 ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
117 case VALUE_MUL_OPERATOR:
122 case VALUE_EMPTY_TYPE:
123 case VALUE_VECTOR_TYPE:
125 //MT_Vector3 supports 'scaling' by another vector, instead of using general transform, Gino?
126 //ret = new CVectorValue(val->GetVector3().Scaled(GetVector3()),GetName());
129 case VALUE_FLOAT_TYPE:
131 ret = new CVectorValue(
132 val->GetVector3()[KX_X] * GetVector3()[KX_X],
133 val->GetVector3()[KX_Y] * GetVector3()[KX_Y],
134 val->GetVector3()[KX_Z] * GetVector3()[KX_Z],
136 ret->SetName(GetName());
141 ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
148 ret = new CErrorValue(val->GetText() + op2str(op) + GetText());
155 double CVectorValue::GetNumber()
161 double* CVectorValue::GetVector3(bool bGetTransformedVec)
163 if (bGetTransformedVec)
164 return m_transformedvec;
173 void CVectorValue::SetVector(double newvec[])
175 m_vec[KX_X] = m_transformedvec[KX_X] = newvec[KX_X];
176 m_vec[KX_Y] = m_transformedvec[KX_Y] = newvec[KX_Y];
177 m_vec[KX_Z] = m_transformedvec[KX_Z] = newvec[KX_Z];
183 void CVectorValue::SetValue(CValue *newval)
186 double* newvec = ((CVectorValue*)newval)->GetVector3();
187 m_vec[KX_X] = m_transformedvec[KX_X] = newvec[KX_X];
188 m_vec[KX_Y] = m_transformedvec[KX_Y] = newvec[KX_Y];
189 m_vec[KX_Z] = m_transformedvec[KX_Z] = newvec[KX_Z];
194 static const STR_String gstrVectorStr=STR_String();
195 const STR_String & CVectorValue::GetText()
198 return gstrVectorStr;
201 CValue* CVectorValue::GetReplica() {
202 CVectorValue* replica = new CVectorValue(*this);
203 replica->ProcessReplica();
207 /*void CVectorValue::Transform(rcMatrix4x4 mat)
209 m_transformedvec = mat*m_vec;