Changeset 343 for cpp/frams/vm/classes
- Timestamp:
- 04/04/15 20:40:02 (10 years ago)
- Location:
- cpp/frams/vm/classes
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
cpp/frams/vm/classes/3dobject.cpp
r286 r343 11 11 { 12 12 #define FIELDSTRUCT Pt3D_Ext 13 static ParamEntry paramtab[]=14 {15 {"XYZ",1,18,"XYZ","3D vector"},16 17 {"x",0,PARAM_NOSTATIC,"x","f",FIELD(p.x),},18 {"y",0,PARAM_NOSTATIC,"y","f",FIELD(p.y),},19 {"z",0,PARAM_NOSTATIC,"z","f",FIELD(p.z),},20 {"new",0,0,"create new XYZ object","p oXYZ(f x,f y,f z)",PROCEDURE(p_new),"3D vectors objects can be also created using the (x,y,z) notation, i.e. var v=(1,2,3) is the same as var v=XYZ.new(1,2,3);",},21 {"newFromVector",0,0,"create new XYZ object","p oXYZ(oVector)",PROCEDURE(p_newFromVector),"used for deserialization"},22 {"clone",0,PARAM_NOSTATIC,"create new XYZ object copying the coordinates","p oXYZ()",PROCEDURE(p_clone),"Note: copying object references does not create new objects. Use clone() if a new object is needed.\n\nExample:\nvar o1=(1,2,3), o2=o1, o3=o1.clone();\no1.y=9999;\n//o2 is now (1,9999,3) but o3 is still (1,2,3)",},23 {"set",0,PARAM_NOSTATIC,"set (copy) coordinates from another XYZ object","p(oXYZ)",PROCEDURE(p_set),},24 {"set3",0,PARAM_NOSTATIC,"set individual 3 coordinates","p(f x,f y,f z)",PROCEDURE(p_set3),},25 {"add",0,PARAM_NOSTATIC,"add","p(oXYZ)",PROCEDURE(p_addvec),"Note: it does not return a new object, just modifies the existing one"},26 {"sub",0,PARAM_NOSTATIC,"subtract","p(oXYZ)",PROCEDURE(p_subvec),"Note: it does not return a new object, just modifies the existing one"},27 {"scale",0,PARAM_NOSTATIC,"multiply by scalar","p(f)",PROCEDURE(p_scale),},28 {"length",0,PARAM_READONLY | PARAM_NOSTATIC,"length","f",GETONLY(length),},29 {"normalize",0,PARAM_NOSTATIC,"normalize","p()",PROCEDURE(p_normalize),"scales the vector length to 1.0"},30 {"toString",0,PARAM_READONLY | PARAM_NOSTATIC,"textual form","s",GETONLY(toString),},31 {"toVector",0,PARAM_READONLY | PARAM_NOSTATIC,"vector of [x,y,z]","oVector",GETONLY(toVector),},32 {"rotate",0,PARAM_NOSTATIC,"rotate using Orient object","p(oOrient)",PROCEDURE(p_rotate),},33 {"revRotate",0,PARAM_NOSTATIC,"reverse rotate using Orient object","p(oOrient)",PROCEDURE(p_revrotate),},34 {"get",0,PARAM_NOSTATIC,"get one of coordinates","p f(d index)",PROCEDURE(p_get),"this function makes the XYZ objects \"indexable\" (so you can use [] for accessing subsequent fields, like in Vector)",},35 {0,0,0,},36 };13 static ParamEntry paramtab[] = 14 { 15 { "XYZ", 1, 18, "XYZ", "3D vector" }, 16 17 { "x", 0, PARAM_NOSTATIC, "x", "f", FIELD(p.x), }, 18 { "y", 0, PARAM_NOSTATIC, "y", "f", FIELD(p.y), }, 19 { "z", 0, PARAM_NOSTATIC, "z", "f", FIELD(p.z), }, 20 { "new", 0, 0, "create new XYZ object", "p oXYZ(f x,f y,f z)", PROCEDURE(p_new), "3D vectors objects can be also created using the (x,y,z) notation, i.e. var v=(1,2,3) is the same as var v=XYZ.new(1,2,3);", }, 21 { "newFromVector", 0, 0, "create new XYZ object", "p oXYZ(oVector)", PROCEDURE(p_newFromVector), "used for deserialization" }, 22 { "clone", 0, PARAM_NOSTATIC, "create new XYZ object copying the coordinates", "p oXYZ()", PROCEDURE(p_clone), "Note: copying object references does not create new objects. Use clone() if a new object is needed.\n\nExample:\nvar o1=(1,2,3), o2=o1, o3=o1.clone();\no1.y=9999;\n//o2 is now (1,9999,3) but o3 is still (1,2,3)", }, 23 { "set", 0, PARAM_NOSTATIC, "set (copy) coordinates from another XYZ object", "p(oXYZ)", PROCEDURE(p_set), }, 24 { "set3", 0, PARAM_NOSTATIC, "set individual 3 coordinates", "p(f x,f y,f z)", PROCEDURE(p_set3), }, 25 { "add", 0, PARAM_NOSTATIC, "add", "p(oXYZ)", PROCEDURE(p_addvec), "Note: it does not return a new object, just modifies the existing one" }, 26 { "sub", 0, PARAM_NOSTATIC, "subtract", "p(oXYZ)", PROCEDURE(p_subvec), "Note: it does not return a new object, just modifies the existing one" }, 27 { "scale", 0, PARAM_NOSTATIC, "multiply by scalar", "p(f)", PROCEDURE(p_scale), }, 28 { "length", 0, PARAM_READONLY | PARAM_NOSTATIC, "length", "f", GETONLY(length), }, 29 { "normalize", 0, PARAM_NOSTATIC, "normalize", "p()", PROCEDURE(p_normalize), "scales the vector length to 1.0" }, 30 { "toString", 0, PARAM_READONLY | PARAM_NOSTATIC, "textual form", "s", GETONLY(toString), }, 31 { "toVector", 0, PARAM_READONLY | PARAM_NOSTATIC, "vector of [x,y,z]", "oVector", GETONLY(toVector), }, 32 { "rotate", 0, PARAM_NOSTATIC, "rotate using Orient object", "p(oOrient)", PROCEDURE(p_rotate), }, 33 { "revRotate", 0, PARAM_NOSTATIC, "reverse rotate using Orient object", "p(oOrient)", PROCEDURE(p_revrotate), }, 34 { "get", 0, PARAM_NOSTATIC, "get one of coordinates", "p f(d index)", PROCEDURE(p_get), "this function makes the XYZ objects \"indexable\" (so you can use [] for accessing subsequent fields, like in Vector)", }, 35 { 0, 0, 0, }, 36 }; 37 37 #undef FIELDSTRUCT 38 return paramtab;39 } 40 41 void Pt3D_Ext::p_new(ExtValue *args, ExtValue *ret)42 { 43 *ret=makeDynamicObject(new Pt3D_Ext(args[2].getDouble(),args[1].getDouble(),args[0].getDouble()));44 } 45 46 static double doubleFromVec(VectorObject *vec, int i)47 { 48 if (i>=vec->data.size()) return 0;49 ExtValue *v=(ExtValue*)vec->data.get(i);50 if (v)51 return v->getDouble();52 return 0;53 } 54 55 static Pt3D pt3DFromVec(VectorObject* v, int offset=0)56 { 57 return Pt3D(doubleFromVec(v,offset),doubleFromVec(v,offset+1),doubleFromVec(v,offset+2));58 } 59 60 void Pt3D_Ext::p_newFromVector(ExtValue *args, ExtValue *ret)61 { 62 VectorObject *vec=VectorObject::fromObject(args->getObject());63 if (vec)64 *ret=makeDynamicObject(new Pt3D_Ext(pt3DFromVec(vec)));65 else66 ret->setEmpty();67 } 68 69 void Pt3D_Ext::p_clone(ExtValue *args, ExtValue *ret)70 { 71 *ret=makeDynamicObject(new Pt3D_Ext(p.x,p.y,p.z));72 } 73 74 void Pt3D_Ext::p_set3(ExtValue *args, ExtValue *ret)75 { 76 p.x=args[2].getDouble();77 p.y=args[1].getDouble();78 p.z=args[0].getDouble();79 ret->setEmpty();80 } 81 82 void Pt3D_Ext::p_set(ExtValue *args, ExtValue *ret)83 { 84 Pt3D_Ext *other=fromObject(args[0]);85 if (other)86 p=other->p;87 ret->setEmpty();38 return paramtab; 39 } 40 41 void Pt3D_Ext::p_new(ExtValue *args, ExtValue *ret) 42 { 43 *ret = makeDynamicObject(new Pt3D_Ext(args[2].getDouble(), args[1].getDouble(), args[0].getDouble())); 44 } 45 46 static double doubleFromVec(VectorObject *vec, int i) 47 { 48 if (i >= vec->data.size()) return 0; 49 ExtValue *v = (ExtValue*)vec->data.get(i); 50 if (v) 51 return v->getDouble(); 52 return 0; 53 } 54 55 static Pt3D pt3DFromVec(VectorObject* v, int offset = 0) 56 { 57 return Pt3D(doubleFromVec(v, offset), doubleFromVec(v, offset + 1), doubleFromVec(v, offset + 2)); 58 } 59 60 void Pt3D_Ext::p_newFromVector(ExtValue *args, ExtValue *ret) 61 { 62 VectorObject *vec = VectorObject::fromObject(args->getObject()); 63 if (vec) 64 *ret = makeDynamicObject(new Pt3D_Ext(pt3DFromVec(vec))); 65 else 66 ret->setEmpty(); 67 } 68 69 void Pt3D_Ext::p_clone(ExtValue *args, ExtValue *ret) 70 { 71 *ret = makeDynamicObject(new Pt3D_Ext(p.x, p.y, p.z)); 72 } 73 74 void Pt3D_Ext::p_set3(ExtValue *args, ExtValue *ret) 75 { 76 p.x = args[2].getDouble(); 77 p.y = args[1].getDouble(); 78 p.z = args[0].getDouble(); 79 ret->setEmpty(); 80 } 81 82 void Pt3D_Ext::p_set(ExtValue *args, ExtValue *ret) 83 { 84 Pt3D_Ext *other = fromObject(args[0]); 85 if (other) 86 p = other->p; 87 ret->setEmpty(); 88 88 } 89 89 90 90 void Pt3D_Ext::get_length(ExtValue *ret) 91 91 { 92 ret->setDouble(p.length());92 ret->setDouble(p.length()); 93 93 } 94 94 95 95 void Pt3D_Ext::get_toString(ExtValue *ret) 96 96 { 97 SString s="(";98 ExtValue v;99 v.setDouble(p.x); s+=v.getString();100 s+=",";101 v.setDouble(p.y); s+=v.getString();102 s+=",";103 v.setDouble(p.z); s+=v.getString();104 s+=")";105 ret->setString(s);106 } 107 108 static void add3Coords(VectorObject* vec, const Pt3D& p)109 { 110 vec->data+=new ExtValue(p.x);111 vec->data+=new ExtValue(p.y);112 vec->data+=new ExtValue(p.z);97 SString s = "("; 98 ExtValue v; 99 v.setDouble(p.x); s += v.getString(); 100 s += ","; 101 v.setDouble(p.y); s += v.getString(); 102 s += ","; 103 v.setDouble(p.z); s += v.getString(); 104 s += ")"; 105 ret->setString(s); 106 } 107 108 static void add3Coords(VectorObject* vec, const Pt3D& p) 109 { 110 vec->data += new ExtValue(p.x); 111 vec->data += new ExtValue(p.y); 112 vec->data += new ExtValue(p.z); 113 113 } 114 114 115 115 void Pt3D_Ext::get_toVector(ExtValue *ret) 116 116 { 117 VectorObject *vec=new VectorObject;118 add3Coords(vec,p);119 ret->setObject(ExtObject(&VectorObject::par,vec));120 } 121 122 void Pt3D_Ext::p_addvec(ExtValue *args, ExtValue *ret)123 { 124 Pt3D_Ext *other=fromObject(args[0]);125 if (other)126 p+=other->p;127 ret->setEmpty();128 } 129 130 void Pt3D_Ext::p_subvec(ExtValue *args, ExtValue *ret)131 { 132 Pt3D_Ext *other=fromObject(args[0]);133 if (other)134 p-=other->p;135 ret->setEmpty();136 } 137 138 void Pt3D_Ext::p_scale(ExtValue *args, ExtValue *ret)139 { 140 double d=args[0].getDouble();141 p.x*=d; p.y*=d; p.z*=d;142 ret->setEmpty();143 } 144 145 void Pt3D_Ext::p_normalize(ExtValue *args, ExtValue *ret)146 { 147 p.normalize();148 ret->setEmpty();149 } 150 151 void Pt3D_Ext::p_rotate(ExtValue *args, ExtValue *ret)152 { 153 Orient_Ext *o=Orient_Ext::fromObject(args[0]);154 if (o)155 { 156 Pt3D tmp=p;157 o->o.transform(p,tmp);158 } 159 ret->setEmpty();160 } 161 162 void Pt3D_Ext::p_revrotate(ExtValue *args, ExtValue *ret)163 { 164 Orient_Ext *o=Orient_Ext::fromObject(args[0]);165 if (o)166 { 167 Pt3D tmp=p;168 o->o.revTransform(p,tmp);169 } 170 ret->setEmpty();171 } 172 173 void Pt3D_Ext::p_get(ExtValue *args, ExtValue *ret)174 { 175 int index=args->getInt();176 if ((index<0)||(index>2))177 ret->setEmpty();178 else179 ret->setDouble((&p.x)[index]);117 VectorObject *vec = new VectorObject; 118 add3Coords(vec, p); 119 ret->setObject(ExtObject(&VectorObject::par, vec)); 120 } 121 122 void Pt3D_Ext::p_addvec(ExtValue *args, ExtValue *ret) 123 { 124 Pt3D_Ext *other = fromObject(args[0]); 125 if (other) 126 p += other->p; 127 ret->setEmpty(); 128 } 129 130 void Pt3D_Ext::p_subvec(ExtValue *args, ExtValue *ret) 131 { 132 Pt3D_Ext *other = fromObject(args[0]); 133 if (other) 134 p -= other->p; 135 ret->setEmpty(); 136 } 137 138 void Pt3D_Ext::p_scale(ExtValue *args, ExtValue *ret) 139 { 140 double d = args[0].getDouble(); 141 p.x *= d; p.y *= d; p.z *= d; 142 ret->setEmpty(); 143 } 144 145 void Pt3D_Ext::p_normalize(ExtValue *args, ExtValue *ret) 146 { 147 p.normalize(); 148 ret->setEmpty(); 149 } 150 151 void Pt3D_Ext::p_rotate(ExtValue *args, ExtValue *ret) 152 { 153 Orient_Ext *o = Orient_Ext::fromObject(args[0]); 154 if (o) 155 { 156 Pt3D tmp = p; 157 o->o.transform(p, tmp); 158 } 159 ret->setEmpty(); 160 } 161 162 void Pt3D_Ext::p_revrotate(ExtValue *args, ExtValue *ret) 163 { 164 Orient_Ext *o = Orient_Ext::fromObject(args[0]); 165 if (o) 166 { 167 Pt3D tmp = p; 168 o->o.revTransform(p, tmp); 169 } 170 ret->setEmpty(); 171 } 172 173 void Pt3D_Ext::p_get(ExtValue *args, ExtValue *ret) 174 { 175 int index = args->getInt(); 176 if ((index < 0) || (index>2)) 177 ret->setEmpty(); 178 else 179 ret->setDouble((&p.x)[index]); 180 180 } 181 181 … … 183 183 { 184 184 #ifdef __CODEGUARD__ 185 static Pt3D_Ext static_pt3dobj;186 static Param static_pt3dparam(getStaticParamtab(),&static_pt3dobj);185 static Pt3D_Ext static_pt3dobj; 186 static Param static_pt3dparam(getStaticParamtab(),&static_pt3dobj); 187 187 #else 188 static Param static_pt3dparam(getStaticParamtab());188 static Param static_pt3dparam(getStaticParamtab()); 189 189 #endif 190 return static_pt3dparam;191 } 192 193 Pt3D_Ext* Pt3D_Ext::fromObject(const ExtValue& v, bool warn)194 { 195 return (Pt3D_Ext*)v.getObjectTarget(getStaticParam().getName(), warn);196 } 197 198 ParamInterface* Pt3D_Ext::getInterface() { return &getStaticParam();}190 return static_pt3dparam; 191 } 192 193 Pt3D_Ext* Pt3D_Ext::fromObject(const ExtValue& v, bool warn) 194 { 195 return (Pt3D_Ext*)v.getObjectTarget(getStaticParam().getName(), warn); 196 } 197 198 ParamInterface* Pt3D_Ext::getInterface() { return &getStaticParam(); } 199 199 200 200 ExtObject Pt3D_Ext::makeStaticObject(Pt3D* p) 201 {return ExtObject(&getStaticParam(),((char*)p)+(((char*)&p->x)-((char*)&((Pt3D_Ext*)p)->p.x)));} 201 { 202 return ExtObject(&getStaticParam(), ((char*)p) + (((char*)&p->x) - ((char*)&((Pt3D_Ext*)p)->p.x))); 203 } 202 204 203 205 ExtObject Pt3D_Ext::makeDynamicObject(Pt3D_Ext* p) 204 {return ExtObject(&getStaticParam(),p);} 206 { 207 return ExtObject(&getStaticParam(), p); 208 } 205 209 206 210 ExtObject Pt3D_Ext::makeDynamicObject(const Pt3D& p) 207 211 { 208 Pt3D_Ext *pe=new Pt3D_Ext(p);209 return ExtObject(&getStaticParam(),pe);212 Pt3D_Ext *pe = new Pt3D_Ext(p); 213 return ExtObject(&getStaticParam(), pe); 210 214 } 211 215 … … 215 219 { 216 220 #define FIELDSTRUCT Orient_Ext 217 static ParamEntry paramtab[]=218 {219 {"Orient",1,29,"Orient","3D orientation, stored as 3x3 matrix."},220 221 {"xx",1,PARAM_NOSTATIC,"orientation.x.x","f",FIELD(o.x.x),},222 {"xy",1,PARAM_NOSTATIC,"orientation.x.y","f",FIELD(o.x.y),},223 {"xz",1,PARAM_NOSTATIC,"orientation.x.z","f",FIELD(o.x.z),},224 {"yx",1,PARAM_NOSTATIC,"orientation.y.x","f",FIELD(o.y.x),},225 {"yy",1,PARAM_NOSTATIC,"orientation.y.y","f",FIELD(o.y.y),},226 {"yz",1,PARAM_NOSTATIC,"orientation.y.z","f",FIELD(o.y.z),},227 {"zx",1,PARAM_NOSTATIC,"orientation.z.x","f",FIELD(o.z.x),},228 {"zy",1,PARAM_NOSTATIC,"orientation.z.y","f",FIELD(o.z.y),},229 {"zz",1,PARAM_NOSTATIC,"orientation.z.z","f",FIELD(o.z.z),},230 231 {"x",0,PARAM_NOSTATIC | PARAM_READONLY,"x vector","oXYZ",GETONLY(x),},232 {"y",0,PARAM_NOSTATIC | PARAM_READONLY,"y vector","oXYZ",GETONLY(y),},233 {"z",0,PARAM_NOSTATIC | PARAM_READONLY,"z vector","oXYZ",GETONLY(z),},234 235 {"new",0,0,"create new Orient object","p oOrient()",PROCEDURE(p_new),},236 {"newFromVector",0,0,"create new Orient object","p oOrient(oVector)",PROCEDURE(p_newFromVector),},237 {"toVector",0,PARAM_READONLY | PARAM_NOSTATIC,"vector representation","oVector",GETONLY(toVector),"for serialization"},238 {"clone",0,PARAM_NOSTATIC,"create new Orient object","p oOrient()",PROCEDURE(p_clone),},239 {"set",0,PARAM_NOSTATIC,"copy from another Orient object","p(oOrient)",PROCEDURE(p_set),},240 {"reset",0,PARAM_NOSTATIC,"set identity matrix","p()",PROCEDURE(p_reset),},241 {"rotate3",0,PARAM_NOSTATIC,"rotate around 3 axes","p(f x,f y,f z)",PROCEDURE(p_rotate3),},242 {"rotate",0,PARAM_NOSTATIC,"rotate using Orient object","p(oOrient)",PROCEDURE(p_rotate),},243 {"revRotate",0,PARAM_NOSTATIC,"reverse rotate using Orient object","p(oOrient)",PROCEDURE(p_revrotate),},244 {"lookAt",0,PARAM_NOSTATIC,"calculate rotation from 2 vectors","p(oXYZ direction,oXYZ up)",PROCEDURE(p_lookat),},245 {"normalize",0,PARAM_NOSTATIC,"normalize","p()",PROCEDURE(p_normalize),},246 {"between2",0,PARAM_NOSTATIC,"interpolate orientation","p(oOrient,oOrient,f amount)",PROCEDURE(p_between2),"The calling Orient receives the orientation interpolated from 2 input orientations.\nExample:\n"247 "var o1=Orient.new(), o2=Orient.new(), o3=Orient.new();\n"248 "o2.rotate3(0,Math.pi/2,0);\n"249 "o3.between2(o1,o2,0); // o3 equals o2\n"250 "o3.between2(o1,o2,1); // o3 equals o1\n"251 "o3.between2(o1,o2,0.5); // o3 is halfway between o1 and o2\n"},252 {"betweenOV",0,PARAM_NOSTATIC,"interpolate orientation","p(oOrient,oXYZ,f amount)",PROCEDURE(p_betweenOV),"Like between2(), but the second Orient is composed of the supplied XYZ vector (X component) and Y Z vectors from the calling object.\n"253 "Example:\n"254 "var o=Orient.new();\n"255 "o.betweenOV(o,(0,1,0),1); //no change, o remains 100 010 001\n"256 "o.betweenOV(o,(0,1,0),0.9); //o is slightly rotated towards (0,1,0)\n"257 "o.betweenOV(o,(0,1,0),0); //o is completely transformed, o.x=(0,1,0)\n"258 },259 {"localToWorld",0,PARAM_NOSTATIC,"transform coordinates","p oXYZ(oXYZ point,oXYZ center)",PROCEDURE(p_localToWorld),},260 {"worldToLocal",0,PARAM_NOSTATIC,"transform coordinates","p oXYZ(oXYZ point,oXYZ center)",PROCEDURE(p_worldToLocal),},261 {"angles",0,PARAM_READONLY | PARAM_NOSTATIC,"Euler angles representation","oXYZ",GETONLY(angles),},262 {"toString",0,PARAM_READONLY | PARAM_NOSTATIC,"textual form","s",GETONLY(toString),},263 {0,0,0,},264 };221 static ParamEntry paramtab[] = 222 { 223 { "Orient", 1, 29, "Orient", "3D orientation, stored as 3x3 matrix." }, 224 225 { "xx", 1, PARAM_NOSTATIC, "orientation.x.x", "f", FIELD(o.x.x), }, 226 { "xy", 1, PARAM_NOSTATIC, "orientation.x.y", "f", FIELD(o.x.y), }, 227 { "xz", 1, PARAM_NOSTATIC, "orientation.x.z", "f", FIELD(o.x.z), }, 228 { "yx", 1, PARAM_NOSTATIC, "orientation.y.x", "f", FIELD(o.y.x), }, 229 { "yy", 1, PARAM_NOSTATIC, "orientation.y.y", "f", FIELD(o.y.y), }, 230 { "yz", 1, PARAM_NOSTATIC, "orientation.y.z", "f", FIELD(o.y.z), }, 231 { "zx", 1, PARAM_NOSTATIC, "orientation.z.x", "f", FIELD(o.z.x), }, 232 { "zy", 1, PARAM_NOSTATIC, "orientation.z.y", "f", FIELD(o.z.y), }, 233 { "zz", 1, PARAM_NOSTATIC, "orientation.z.z", "f", FIELD(o.z.z), }, 234 235 { "x", 0, PARAM_NOSTATIC | PARAM_READONLY, "x vector", "oXYZ", GETONLY(x), }, 236 { "y", 0, PARAM_NOSTATIC | PARAM_READONLY, "y vector", "oXYZ", GETONLY(y), }, 237 { "z", 0, PARAM_NOSTATIC | PARAM_READONLY, "z vector", "oXYZ", GETONLY(z), }, 238 239 { "new", 0, 0, "create new Orient object", "p oOrient()", PROCEDURE(p_new), }, 240 { "newFromVector", 0, 0, "create new Orient object", "p oOrient(oVector)", PROCEDURE(p_newFromVector), }, 241 { "toVector", 0, PARAM_READONLY | PARAM_NOSTATIC, "vector representation", "oVector", GETONLY(toVector), "for serialization" }, 242 { "clone", 0, PARAM_NOSTATIC, "create new Orient object", "p oOrient()", PROCEDURE(p_clone), }, 243 { "set", 0, PARAM_NOSTATIC, "copy from another Orient object", "p(oOrient)", PROCEDURE(p_set), }, 244 { "reset", 0, PARAM_NOSTATIC, "set identity matrix", "p()", PROCEDURE(p_reset), }, 245 { "rotate3", 0, PARAM_NOSTATIC, "rotate around 3 axes", "p(f x,f y,f z)", PROCEDURE(p_rotate3), }, 246 { "rotate", 0, PARAM_NOSTATIC, "rotate using Orient object", "p(oOrient)", PROCEDURE(p_rotate), }, 247 { "revRotate", 0, PARAM_NOSTATIC, "reverse rotate using Orient object", "p(oOrient)", PROCEDURE(p_revrotate), }, 248 { "lookAt", 0, PARAM_NOSTATIC, "calculate rotation from 2 vectors", "p(oXYZ direction,oXYZ up)", PROCEDURE(p_lookat), }, 249 { "normalize", 0, PARAM_NOSTATIC, "normalize", "p()", PROCEDURE(p_normalize), }, 250 { "between2", 0, PARAM_NOSTATIC, "interpolate orientation", "p(oOrient,oOrient,f amount)", PROCEDURE(p_between2), "The calling Orient receives the orientation interpolated from 2 input orientations.\nExample:\n" 251 "var o1=Orient.new(), o2=Orient.new(), o3=Orient.new();\n" 252 "o2.rotate3(0,Math.pi/2,0);\n" 253 "o3.between2(o1,o2,0); // o3 equals o2\n" 254 "o3.between2(o1,o2,1); // o3 equals o1\n" 255 "o3.between2(o1,o2,0.5); // o3 is halfway between o1 and o2\n" }, 256 { "betweenOV", 0, PARAM_NOSTATIC, "interpolate orientation", "p(oOrient,oXYZ,f amount)", PROCEDURE(p_betweenOV), "Like between2(), but the second Orient is composed of the supplied XYZ vector (X component) and Y Z vectors from the calling object.\n" 257 "Example:\n" 258 "var o=Orient.new();\n" 259 "o.betweenOV(o,(0,1,0),1); //no change, o remains 100 010 001\n" 260 "o.betweenOV(o,(0,1,0),0.9); //o is slightly rotated towards (0,1,0)\n" 261 "o.betweenOV(o,(0,1,0),0); //o is completely transformed, o.x=(0,1,0)\n" 262 }, 263 { "localToWorld", 0, PARAM_NOSTATIC, "transform coordinates", "p oXYZ(oXYZ point,oXYZ center)", PROCEDURE(p_localToWorld), }, 264 { "worldToLocal", 0, PARAM_NOSTATIC, "transform coordinates", "p oXYZ(oXYZ point,oXYZ center)", PROCEDURE(p_worldToLocal), }, 265 { "angles", 0, PARAM_READONLY | PARAM_NOSTATIC, "Euler angles representation", "oXYZ", GETONLY(angles), }, 266 { "toString", 0, PARAM_READONLY | PARAM_NOSTATIC, "textual form", "s", GETONLY(toString), }, 267 { 0, 0, 0, }, 268 }; 265 269 #undef FIELDSTRUCT 266 return paramtab;267 } 268 269 void Orient_Ext::p_new(ExtValue *args, ExtValue *ret)270 { 271 *ret=makeDynamicObject(new Orient_Ext());272 } 273 274 void Orient_Ext::p_newFromVector(ExtValue *args, ExtValue *ret)275 { 276 VectorObject *vec=VectorObject::fromObject(args->getObject());277 if (vec)278 *ret=makeDynamicObject(new Orient_Ext(Orient(pt3DFromVec(vec,0),pt3DFromVec(vec,3),pt3DFromVec(vec,6))));279 else280 ret->setEmpty();270 return paramtab; 271 } 272 273 void Orient_Ext::p_new(ExtValue *args, ExtValue *ret) 274 { 275 *ret = makeDynamicObject(new Orient_Ext()); 276 } 277 278 void Orient_Ext::p_newFromVector(ExtValue *args, ExtValue *ret) 279 { 280 VectorObject *vec = VectorObject::fromObject(args->getObject()); 281 if (vec) 282 *ret = makeDynamicObject(new Orient_Ext(Orient(pt3DFromVec(vec, 0), pt3DFromVec(vec, 3), pt3DFromVec(vec, 6)))); 283 else 284 ret->setEmpty(); 281 285 } 282 286 283 287 void Orient_Ext::get_toVector(ExtValue *ret) 284 288 { 285 VectorObject *vec=new VectorObject;286 add3Coords(vec,o.x);287 add3Coords(vec,o.y);288 add3Coords(vec,o.z);289 ret->setObject(ExtObject(&VectorObject::par,vec));290 } 291 292 void Orient_Ext::p_clone(ExtValue *args, ExtValue *ret)293 { 294 *ret=makeDynamicObject(new Orient_Ext(o));295 } 296 297 void Orient_Ext::p_set(ExtValue *args, ExtValue *ret)298 { 299 Orient_Ext *other=fromObject(args[0]);300 if (other)301 o=other->o;302 ret->setEmpty();303 } 304 305 void Orient_Ext::p_reset(ExtValue *args, ExtValue *ret)306 { 307 o=Orient_1;308 ret->setEmpty();289 VectorObject *vec = new VectorObject; 290 add3Coords(vec, o.x); 291 add3Coords(vec, o.y); 292 add3Coords(vec, o.z); 293 ret->setObject(ExtObject(&VectorObject::par, vec)); 294 } 295 296 void Orient_Ext::p_clone(ExtValue *args, ExtValue *ret) 297 { 298 *ret = makeDynamicObject(new Orient_Ext(o)); 299 } 300 301 void Orient_Ext::p_set(ExtValue *args, ExtValue *ret) 302 { 303 Orient_Ext *other = fromObject(args[0]); 304 if (other) 305 o = other->o; 306 ret->setEmpty(); 307 } 308 309 void Orient_Ext::p_reset(ExtValue *args, ExtValue *ret) 310 { 311 o = Orient_1; 312 ret->setEmpty(); 309 313 } 310 314 311 315 void Orient_Ext::get_x(PARAMGETARGS) 312 316 { 313 *ret=Pt3D_Ext::makeStaticObject(&o.x);317 *ret = Pt3D_Ext::makeStaticObject(&o.x); 314 318 } 315 319 316 320 void Orient_Ext::get_y(PARAMGETARGS) 317 321 { 318 *ret=Pt3D_Ext::makeStaticObject(&o.y);322 *ret = Pt3D_Ext::makeStaticObject(&o.y); 319 323 } 320 324 321 325 void Orient_Ext::get_z(PARAMGETARGS) 322 326 { 323 *ret=Pt3D_Ext::makeStaticObject(&o.z); 324 } 325 326 void Orient_Ext::p_lookat(ExtValue *args,ExtValue *ret) 327 { 328 Pt3D_Ext *dir=Pt3D_Ext::fromObject(args[1]),*up=Pt3D_Ext::fromObject(args[0]); 329 if (dir&&up) 330 o.lookAt(dir->p,up->p); 331 ret->setEmpty(); 332 } 333 334 void Orient_Ext::p_rotate3(ExtValue *args,ExtValue *ret) 335 { 336 Pt3D p(args[2].getDouble(),args[1].getDouble(),args[0].getDouble()); 337 o.rotate(p); 338 ret->setEmpty(); 339 } 340 341 void Orient_Ext::p_rotate(ExtValue *args,ExtValue *ret) 342 { 343 Orient_Ext *obj=Orient_Ext::fromObject(args[0]); 344 if (!obj) 345 { 346 Orient tmp=o; 347 obj->o.transform(o,tmp); 348 } 349 ret->setEmpty(); 350 } 351 352 void Orient_Ext::p_revrotate(ExtValue *args,ExtValue *ret) 353 { 354 Orient_Ext *obj=Orient_Ext::fromObject(args[0]); 355 if (obj) 356 { 357 Orient tmp=o; 358 obj->o.revTransform(o,tmp); 359 } 360 ret->setEmpty(); 361 } 362 363 void Orient_Ext::p_normalize(ExtValue *args,ExtValue *ret) 364 { 365 o.normalize(); 366 ret->setEmpty(); 367 } 368 369 void Orient_Ext::p_between2(ExtValue *args,ExtValue *ret) 370 { 371 Orient_Ext *o1=Orient_Ext::fromObject(args[2]); 372 Orient_Ext *o2=Orient_Ext::fromObject(args[1]); 373 if (o1&&o2) 374 { 375 double q1=args[0].getDouble(),q2=1.0-q1; 376 o.x.x=q1*o1->o.x.x+q2*o2->o.x.x; 377 o.x.y=q1*o1->o.x.y+q2*o2->o.x.y; 378 o.x.z=q1*o1->o.x.z+q2*o2->o.x.z; 379 o.y.x=q1*o1->o.y.x+q2*o2->o.y.x; 380 o.y.y=q1*o1->o.y.y+q2*o2->o.y.y; 381 o.y.z=q1*o1->o.y.z+q2*o2->o.y.z; 382 o.z.x=q1*o1->o.z.x+q2*o2->o.z.x; 383 o.z.y=q1*o1->o.z.y+q2*o2->o.z.y; 384 o.z.z=q1*o1->o.z.z+q2*o2->o.z.z; 327 *ret = Pt3D_Ext::makeStaticObject(&o.z); 328 } 329 330 void Orient_Ext::p_lookat(ExtValue *args, ExtValue *ret) 331 { 332 Pt3D_Ext *dir = Pt3D_Ext::fromObject(args[1]), *up = Pt3D_Ext::fromObject(args[0]); 333 if (dir&&up) 334 o.lookAt(dir->p, up->p); 335 ret->setEmpty(); 336 } 337 338 void Orient_Ext::p_rotate3(ExtValue *args, ExtValue *ret) 339 { 340 Pt3D p(args[2].getDouble(), args[1].getDouble(), args[0].getDouble()); 341 o.rotate(p); 342 ret->setEmpty(); 343 } 344 345 void Orient_Ext::p_rotate(ExtValue *args, ExtValue *ret) 346 { 347 Orient_Ext *obj = Orient_Ext::fromObject(args[0]); 348 if (!obj) 349 { 350 Orient tmp = o; 351 obj->o.transform(o, tmp); 352 } 353 ret->setEmpty(); 354 } 355 356 void Orient_Ext::p_revrotate(ExtValue *args, ExtValue *ret) 357 { 358 Orient_Ext *obj = Orient_Ext::fromObject(args[0]); 359 if (obj) 360 { 361 Orient tmp = o; 362 obj->o.revTransform(o, tmp); 363 } 364 ret->setEmpty(); 365 } 366 367 void Orient_Ext::p_normalize(ExtValue *args, ExtValue *ret) 368 { 385 369 o.normalize(); 386 } 387 ret->setEmpty(); 388 } 389 390 void Orient_Ext::p_betweenOV(ExtValue *args,ExtValue *ret) 391 { 392 Orient_Ext *o1=Orient_Ext::fromObject(args[2]); 393 Pt3D_Ext *p2=Pt3D_Ext::fromObject(args[1]); 394 if (o1&&p2) 395 { 396 double q1=args[0].getDouble(),q2=1.0-q1; 397 o.x.x=q1*o1->o.x.x+q2*p2->p.x; 398 o.x.y=q1*o1->o.x.y+q2*p2->p.y; 399 o.x.z=q1*o1->o.x.z+q2*p2->p.z; 400 o.normalize(); 401 } 402 ret->setEmpty(); 403 } 404 405 void Orient_Ext::p_localToWorld(ExtValue *args,ExtValue *ret) 406 { 407 Pt3D_Ext *center,*point; 408 point=Pt3D_Ext::fromObject(args[1]); 409 center=Pt3D_Ext::fromObject(args[0]); 410 if (center && point) 411 { 412 Pt3D d; 413 Pt3D src=point->p; 414 o.transform(d,src); 415 d+=center->p; 416 *ret=Pt3D_Ext::makeDynamicObject(new Pt3D_Ext(d)); 417 } 418 else 419 ret->setEmpty(); 420 } 421 422 void Orient_Ext::p_worldToLocal(ExtValue *args,ExtValue *ret) 423 { 424 Pt3D_Ext *center,*point; 425 point=Pt3D_Ext::fromObject(args[1]); 426 center=Pt3D_Ext::fromObject(args[0]); 427 if (center && point) 428 { 429 Pt3D d; 430 Pt3D src=point->p; 431 d-=center->p; 432 o.revTransform(d,src); 433 *ret=Pt3D_Ext::makeDynamicObject(new Pt3D_Ext(d)); 434 } 435 else 436 ret->setEmpty(); 370 ret->setEmpty(); 371 } 372 373 void Orient_Ext::p_between2(ExtValue *args, ExtValue *ret) 374 { 375 Orient_Ext *o1 = Orient_Ext::fromObject(args[2]); 376 Orient_Ext *o2 = Orient_Ext::fromObject(args[1]); 377 if (o1&&o2) 378 { 379 double q1 = args[0].getDouble(), q2 = 1.0 - q1; 380 o.x.x = q1*o1->o.x.x + q2*o2->o.x.x; 381 o.x.y = q1*o1->o.x.y + q2*o2->o.x.y; 382 o.x.z = q1*o1->o.x.z + q2*o2->o.x.z; 383 o.y.x = q1*o1->o.y.x + q2*o2->o.y.x; 384 o.y.y = q1*o1->o.y.y + q2*o2->o.y.y; 385 o.y.z = q1*o1->o.y.z + q2*o2->o.y.z; 386 o.z.x = q1*o1->o.z.x + q2*o2->o.z.x; 387 o.z.y = q1*o1->o.z.y + q2*o2->o.z.y; 388 o.z.z = q1*o1->o.z.z + q2*o2->o.z.z; 389 o.normalize(); 390 } 391 ret->setEmpty(); 392 } 393 394 void Orient_Ext::p_betweenOV(ExtValue *args, ExtValue *ret) 395 { 396 Orient_Ext *o1 = Orient_Ext::fromObject(args[2]); 397 Pt3D_Ext *p2 = Pt3D_Ext::fromObject(args[1]); 398 if (o1&&p2) 399 { 400 double q1 = args[0].getDouble(), q2 = 1.0 - q1; 401 o.x.x = q1*o1->o.x.x + q2*p2->p.x; 402 o.x.y = q1*o1->o.x.y + q2*p2->p.y; 403 o.x.z = q1*o1->o.x.z + q2*p2->p.z; 404 o.normalize(); 405 } 406 ret->setEmpty(); 407 } 408 409 void Orient_Ext::p_localToWorld(ExtValue *args, ExtValue *ret) 410 { 411 Pt3D_Ext *center, *point; 412 point = Pt3D_Ext::fromObject(args[1]); 413 center = Pt3D_Ext::fromObject(args[0]); 414 if (center && point) 415 { 416 Pt3D d; 417 Pt3D src = point->p; 418 o.transform(d, src); 419 d += center->p; 420 *ret = Pt3D_Ext::makeDynamicObject(new Pt3D_Ext(d)); 421 } 422 else 423 ret->setEmpty(); 424 } 425 426 void Orient_Ext::p_worldToLocal(ExtValue *args, ExtValue *ret) 427 { 428 Pt3D_Ext *center, *point; 429 point = Pt3D_Ext::fromObject(args[1]); 430 center = Pt3D_Ext::fromObject(args[0]); 431 if (center && point) 432 { 433 Pt3D d; 434 Pt3D src = point->p; 435 d -= center->p; 436 o.revTransform(d, src); 437 *ret = Pt3D_Ext::makeDynamicObject(new Pt3D_Ext(d)); 438 } 439 else 440 ret->setEmpty(); 437 441 } 438 442 439 443 void Orient_Ext::get_angles(ExtValue *ret) 440 444 { 441 *ret=Pt3D_Ext::makeDynamicObject(new Pt3D_Ext(o.getAngles()));445 *ret = Pt3D_Ext::makeDynamicObject(new Pt3D_Ext(o.getAngles())); 442 446 } 443 447 444 448 void Orient_Ext::get_toString(ExtValue *ret) 445 449 { 446 Pt3D a=o.getAngles();447 ret->setString(SString::sprintf("Orient@(%g,%g,%g)",a.x,a.y,a.z));450 Pt3D a = o.getAngles(); 451 ret->setString(SString::sprintf("Orient@(%g,%g,%g)", a.x, a.y, a.z)); 448 452 } 449 453 … … 451 455 { 452 456 #ifdef __CODEGUARD__ 453 static Orient_Ext static_orientobj;454 static Param static_orientparam(getStaticParamtab(),&static_orientobj);457 static Orient_Ext static_orientobj; 458 static Param static_orientparam(getStaticParamtab(),&static_orientobj); 455 459 #else 456 static Param static_orientparam(getStaticParamtab());460 static Param static_orientparam(getStaticParamtab()); 457 461 #endif 458 return static_orientparam;462 return static_orientparam; 459 463 } 460 464 461 465 Orient_Ext* Orient_Ext::fromObject(const ExtValue& v) 462 466 { 463 return (Orient_Ext*)v.getObjectTarget(getStaticParam().getName());464 } 465 466 ParamInterface* Orient_Ext::getInterface() { return &getStaticParam();}467 return (Orient_Ext*)v.getObjectTarget(getStaticParam().getName()); 468 } 469 470 ParamInterface* Orient_Ext::getInterface() { return &getStaticParam(); } 467 471 468 472 ExtObject Orient_Ext::makeStaticObject(Orient* o) 469 {return ExtObject(&getStaticParam(),((char*)o)+(((char*)&o->x)-((char*)&((Orient_Ext*)o)->o.x)));} 473 { 474 return ExtObject(&getStaticParam(), ((char*)o) + (((char*)&o->x) - ((char*)&((Orient_Ext*)o)->o.x))); 475 } 470 476 471 477 ExtObject Orient_Ext::makeDynamicObject(Orient_Ext* p) 472 {return ExtObject(&getStaticParam(),p);} 478 { 479 return ExtObject(&getStaticParam(), p); 480 } 473 481 474 482 ///////////// -
cpp/frams/vm/classes/3dobject.h
r286 r343 9 9 #include <frams/util/extvalue.h> 10 10 11 class Pt3D_Ext : public DestrBase11 class Pt3D_Ext : public DestrBase 12 12 { 13 14 Pt3D p;13 public: 14 Pt3D p; 15 15 16 Pt3D_Ext(double x,double y,double z):p(x,y,z) {}17 Pt3D_Ext():p(0,0,0) {}18 Pt3D_Ext(const Pt3D &i):p(i) {}16 Pt3D_Ext(double x, double y, double z) :p(x, y, z) {} 17 Pt3D_Ext() :p(0, 0, 0) {} 18 Pt3D_Ext(const Pt3D &i) :p(i) {} 19 19 #define STATRICKCLASS Pt3D_Ext 20 PARAMPROCDEF(p_new);21 PARAMPROCDEF(p_newFromVector);22 PARAMPROCDEF(p_clone);23 PARAMGETDEF(length);24 PARAMPROCDEF(p_addvec);25 PARAMPROCDEF(p_subvec);26 PARAMPROCDEF(p_scale);27 PARAMPROCDEF(p_rotate);28 PARAMPROCDEF(p_revrotate);29 PARAMPROCDEF(p_normalize);30 PARAMGETDEF(toString);31 PARAMGETDEF(toVector);32 PARAMPROCDEF(p_set);33 PARAMPROCDEF(p_set3);34 PARAMPROCDEF(p_get);20 PARAMPROCDEF(p_new); 21 PARAMPROCDEF(p_newFromVector); 22 PARAMPROCDEF(p_clone); 23 PARAMGETDEF(length); 24 PARAMPROCDEF(p_addvec); 25 PARAMPROCDEF(p_subvec); 26 PARAMPROCDEF(p_scale); 27 PARAMPROCDEF(p_rotate); 28 PARAMPROCDEF(p_revrotate); 29 PARAMPROCDEF(p_normalize); 30 PARAMGETDEF(toString); 31 PARAMGETDEF(toVector); 32 PARAMPROCDEF(p_set); 33 PARAMPROCDEF(p_set3); 34 PARAMPROCDEF(p_get); 35 35 #undef STATRICKCLASS 36 36 37 static ParamInterface* getInterface();38 static ExtObject makeStaticObject(Pt3D* p);39 static ExtObject makeDynamicObject(Pt3D_Ext* p);40 static ExtObject makeDynamicObject(const Pt3D& p);41 static Pt3D_Ext* fromObject(const ExtValue& v,bool warn=true);42 static Param& getStaticParam();43 static ParamEntry* getStaticParamtab();37 static ParamInterface* getInterface(); 38 static ExtObject makeStaticObject(Pt3D* p); 39 static ExtObject makeDynamicObject(Pt3D_Ext* p); 40 static ExtObject makeDynamicObject(const Pt3D& p); 41 static Pt3D_Ext* fromObject(const ExtValue& v, bool warn = true); 42 static Param& getStaticParam(); 43 static ParamEntry* getStaticParamtab(); 44 44 }; 45 45 46 class Orient_Ext : public DestrBase46 class Orient_Ext : public DestrBase 47 47 { 48 49 Orient o;48 public: 49 Orient o; 50 50 51 Orient_Ext():o(Orient_1) {}52 Orient_Ext(const Orient& other):o(other) {}51 Orient_Ext() :o(Orient_1) {} 52 Orient_Ext(const Orient& other) :o(other) {} 53 53 #define STATRICKCLASS Orient_Ext 54 PARAMPROCDEF(p_new);55 PARAMPROCDEF(p_newFromVector);56 PARAMPROCDEF(p_clone);57 PARAMGETDEF(toString);58 PARAMGETDEF(toVector);59 PARAMGETDEF(x);60 PARAMGETDEF(y);61 PARAMGETDEF(z);62 PARAMPROCDEF(p_rotate3);63 PARAMPROCDEF(p_rotate);64 PARAMPROCDEF(p_revrotate);65 PARAMPROCDEF(p_lookat);66 PARAMPROCDEF(p_normalize);67 PARAMPROCDEF(p_between2);68 PARAMPROCDEF(p_betweenOV);69 PARAMPROCDEF(p_set);70 PARAMPROCDEF(p_reset);71 PARAMPROCDEF(p_localToWorld);72 PARAMPROCDEF(p_worldToLocal);73 PARAMGETDEF(angles);54 PARAMPROCDEF(p_new); 55 PARAMPROCDEF(p_newFromVector); 56 PARAMPROCDEF(p_clone); 57 PARAMGETDEF(toString); 58 PARAMGETDEF(toVector); 59 PARAMGETDEF(x); 60 PARAMGETDEF(y); 61 PARAMGETDEF(z); 62 PARAMPROCDEF(p_rotate3); 63 PARAMPROCDEF(p_rotate); 64 PARAMPROCDEF(p_revrotate); 65 PARAMPROCDEF(p_lookat); 66 PARAMPROCDEF(p_normalize); 67 PARAMPROCDEF(p_between2); 68 PARAMPROCDEF(p_betweenOV); 69 PARAMPROCDEF(p_set); 70 PARAMPROCDEF(p_reset); 71 PARAMPROCDEF(p_localToWorld); 72 PARAMPROCDEF(p_worldToLocal); 73 PARAMGETDEF(angles); 74 74 #undef STATRICKCLASS 75 75 76 static ParamInterface* getInterface();77 static ExtObject makeStaticObject(Orient* p);78 static ExtObject makeDynamicObject(Orient_Ext* p);79 static Orient_Ext* fromObject(const ExtValue& v);80 static Param& getStaticParam();81 static ParamEntry* getStaticParamtab();76 static ParamInterface* getInterface(); 77 static ExtObject makeStaticObject(Orient* p); 78 static ExtObject makeDynamicObject(Orient_Ext* p); 79 static Orient_Ext* fromObject(const ExtValue& v); 80 static Param& getStaticParam(); 81 static ParamEntry* getStaticParamtab(); 82 82 }; 83 83
Note: See TracChangeset
for help on using the changeset viewer.