Blender  V2.59
VectorValue.cpp
Go to the documentation of this file.
00001 
00004 // VectorValue.cpp: implementation of the CVectorValue class.
00005 /*
00006  * Copyright (c) 1996-2000 Erwin Coumans <coockie@acm.org>
00007  *
00008  * Permission to use, copy, modify, distribute and sell this software
00009  * and its documentation for any purpose is hereby granted without fee,
00010  * provided that the above copyright notice appear in all copies and
00011  * that both that copyright notice and this permission notice appear
00012  * in supporting documentation.  Erwin Coumans makes no
00013  * representations about the suitability of this software for any
00014  * purpose.  It is provided "as is" without express or implied warranty.
00015  *
00016  */
00017 
00018 #if defined(WIN32) && !defined(FREE_WINDOWS)
00019 #pragma warning (disable:4786)
00020 #endif
00021 
00022 #include "Value.h"
00023 #include "VectorValue.h"
00024 #include "ErrorValue.h"
00025 //#include "MatrixValue.h"
00026 #include "VoidValue.h"
00027 #include "StringValue.h"
00028 //#include "FactoryManager.h"
00029 
00030 
00031 
00033 // Construction/Destruction
00035 
00036 CVectorValue::CVectorValue(float x,float y,float z, AllocationTYPE alloctype)
00037 {
00038         SetCustomFlag1(false);//FancyOutput=false;
00039         
00040         if (alloctype == STACKVALUE)
00041         {
00042                 CValue::DisableRefCount();
00043         };
00044         
00045         m_vec[KX_X] = m_transformedvec[KX_X] = x;
00046         m_vec[KX_Y] = m_transformedvec[KX_Y] = y;
00047         m_vec[KX_Z] = m_transformedvec[KX_Z] = z;
00048         
00049 }
00050 CVectorValue::CVectorValue(double vec[],const char *name,AllocationTYPE alloctype) {
00051         
00052         SetCustomFlag1(false);//FancyOutput=false;
00053         
00054         m_vec[KX_X] = m_transformedvec[KX_X] = vec[KX_X];
00055         m_vec[KX_Y] = m_transformedvec[KX_Y] = vec[KX_Y];
00056         m_vec[KX_Z] = m_transformedvec[KX_Z] = vec[KX_Z];
00057                 
00058         if (alloctype == STACKVALUE)
00059         {
00060                 CValue::DisableRefCount();
00061                 
00062         }
00063         
00064         SetName(name);
00065 }
00066 
00067 CVectorValue::CVectorValue(double vec[],AllocationTYPE alloctype) {
00068         
00069         SetCustomFlag1(false);//FancyOutput=false;
00070         
00071         m_vec[KX_X] = m_transformedvec[KX_X] = vec[KX_X];
00072         m_vec[KX_Y] = m_transformedvec[KX_Y] = vec[KX_Y];
00073         m_vec[KX_Z] = m_transformedvec[KX_Z] = vec[KX_Z];
00074         
00075         if (alloctype == STACKVALUE)
00076         {
00077                 CValue::DisableRefCount();
00078                 
00079         }
00080         
00081         
00082 }
00083 CVectorValue::~CVectorValue()
00084 {
00085 
00086 }
00087 
00088 CValue* CVectorValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val)
00089 /*
00090 pre: the type of val is dtype
00091 ret: a new object containing the result of applying operator op to val and
00092 this object
00093 */
00094 {
00095         CValue *ret = NULL;
00096         
00097         switch(op)
00098         { 
00099         case VALUE_ADD_OPERATOR: 
00100                 {
00101                         switch (dtype)
00102                         {
00103                         case VALUE_EMPTY_TYPE:
00104                         case VALUE_VECTOR_TYPE: 
00105                                 {
00106                                         ret = new CVectorValue(
00107                                                 val->GetVector3()[KX_X] + GetVector3()[KX_X],
00108                                                 val->GetVector3()[KX_Y] + GetVector3()[KX_Y],
00109                                                 val->GetVector3()[KX_Z] + GetVector3()[KX_Z],
00110                                                 CValue::HEAPVALUE);
00111                                         ret->SetName(GetName());
00112                                         break;
00113                                 }
00114                         
00115                         default: 
00116                                 ret = new CErrorValue(val->GetText() + op2str(op) +     GetText());
00117                         }
00118                         break;
00119                 }
00120         case VALUE_MUL_OPERATOR:
00121                 {
00122                         switch (dtype)
00123                         {
00124                                 
00125                         case VALUE_EMPTY_TYPE:
00126                         case VALUE_VECTOR_TYPE: 
00127                                 {
00128                                         //MT_Vector3 supports 'scaling' by another vector, instead of using general transform, Gino?
00129                                         //ret = new CVectorValue(val->GetVector3().Scaled(GetVector3()),GetName());
00130                                         break;
00131                                 }
00132                         case VALUE_FLOAT_TYPE: 
00133                                 {
00134                                         ret = new CVectorValue(
00135                                                 val->GetVector3()[KX_X] * GetVector3()[KX_X],
00136                                                 val->GetVector3()[KX_Y] * GetVector3()[KX_Y],
00137                                                 val->GetVector3()[KX_Z] * GetVector3()[KX_Z],
00138                                                 CValue::HEAPVALUE);
00139                                         ret->SetName(GetName());
00140                                         break;
00141                                 }
00142                         
00143                         default: 
00144                                 ret = new CErrorValue(val->GetText() + op2str(op) +     GetText());
00145                         }
00146                         break;
00147 
00148                 }
00149         
00150         default:
00151                 ret = new CErrorValue(val->GetText() + op2str(op) +     GetText());
00152         }
00153 
00154         
00155         return ret;
00156 }
00157 
00158 double CVectorValue::GetNumber()
00159 {
00160         return m_vec[KX_X];
00161 }
00162 
00163 
00164 double* CVectorValue::GetVector3(bool bGetTransformedVec)
00165 {
00166         if (bGetTransformedVec)
00167                 return m_transformedvec;
00168         // else 
00169         return m_vec;
00170 }
00171 
00172 
00173 
00174 
00175 
00176 void CVectorValue::SetVector(double newvec[])
00177 {
00178         m_vec[KX_X] = m_transformedvec[KX_X] = newvec[KX_X];
00179         m_vec[KX_Y] = m_transformedvec[KX_Y] = newvec[KX_Y];
00180         m_vec[KX_Z] = m_transformedvec[KX_Z] = newvec[KX_Z];
00181         
00182         SetModified(true);
00183 }
00184 
00185 
00186 void CVectorValue::SetValue(CValue *newval)
00187 {
00188         
00189         double* newvec = ((CVectorValue*)newval)->GetVector3();
00190         m_vec[KX_X] = m_transformedvec[KX_X] = newvec[KX_X];
00191         m_vec[KX_Y] = m_transformedvec[KX_Y] = newvec[KX_Y];
00192         m_vec[KX_Z] = m_transformedvec[KX_Z] = newvec[KX_Z];
00193         
00194         SetModified(true);
00195 }
00196 
00197 static const STR_String gstrVectorStr=STR_String();
00198 const STR_String & CVectorValue::GetText()
00199 {
00200         assertd(false);
00201         return gstrVectorStr;
00202 }
00203 
00204 CValue* CVectorValue::GetReplica() { 
00205         CVectorValue* replica = new CVectorValue(*this);
00206         replica->ProcessReplica();
00207         return replica;
00208 };
00209 
00210 /*void CVectorValue::Transform(rcMatrix4x4 mat)
00211 {
00212         m_transformedvec = mat*m_vec;
00213 }
00214 */
00215 
00216