41 #include <libFreeWRL.h>
43 #include "../vrml_parser/Structs.h"
44 #include "../main/headers.h"
45 #include "../vrml_parser/CRoutes.h"
83 MARK_EVENT (X3D_NODE(node),offsetof (
struct X3D_MetadataSet, metadata));
85 MARK_EVENT (X3D_NODE(node),offsetof (
struct X3D_MetadataSet, reference));
104 #define META_IS_INITIALIZED (node->_ichange != 0)
107 #define CMD_I32(type) void compile_MetadataSF##type (struct X3D_MetadataSF##type *node) { \
108 if META_IS_INITIALIZED { \
109 if (node->tickTime != TickTime()) { \
110 node->value = node->setValue; \
111 node->valueChanged = node->setValue; \
112 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataSF##type, valueChanged)); \
116 node->valueChanged = node->value; node->setValue = node->value; \
118 node->tickTime = TickTime(); \
122 #define CMD_FL(type) void compile_MetadataSF##type (struct X3D_MetadataSF##type *node) { \
123 if META_IS_INITIALIZED { \
124 if (node->tickTime != TickTime()) { \
125 node->value = node->setValue; \
126 node->valueChanged = node->setValue; \
127 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataSF##type, valueChanged)); \
131 node->valueChanged = node->value; node->setValue = node->value; \
133 node->tickTime = TickTime(); \
137 #define CMD_MFL(type,elelength) void compile_MetadataSF##type (struct X3D_MetadataSF##type *node) { \
139 if META_IS_INITIALIZED { \
140 for (count=0; count < elelength; count++) { \
141 if (!APPROX(node->value.c[count],node->setValue.c[count])) { \
142 memcpy (&node->value, &node->setValue, sizeof node->value.c[0]* elelength); \
143 memcpy (&node->valueChanged, &node->setValue, sizeof node->value.c[0] * elelength); \
144 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataSF##type, valueChanged)); \
150 memcpy (&node->setValue, &node->value, sizeof node->value.c[0]* elelength); \
151 memcpy (&node->valueChanged, &node->value, sizeof node->value.c[0] * elelength); \
160 #define CMD_MULTI(mtype, type,elelength,dataSize) void compile_MetadataMF##type (struct X3D_MetadataMF##type *node) { \
161 int count; int changed = FALSE; \
162 if META_IS_INITIALIZED { \
163 if (node->value.n != node->setValue.n) changed = TRUE; else { \
165 for (count=0; count<node->setValue.n; count++) { \
166 int count2; for (count2=0; count2<elelength; count2++) { if (!APPROX(node->value.p[count].c[count2], node->setValue.p[count].c[count2])) changed = TRUE; break; }\
167 if (changed) break; } \
172 FREE_IF_NZ (node->value.p); \
173 FREE_IF_NZ(node->valueChanged.p); \
174 node->value.p = MALLOC(mtype, dataSize * node->setValue.n * elelength); \
175 node->valueChanged.p = MALLOC(mtype, dataSize * node->setValue.n * elelength); \
176 memcpy(node->value.p, node->setValue.p, dataSize * node->setValue.n * elelength); \
177 memcpy(node->valueChanged.p, node->setValue.p, dataSize * node->setValue.n * elelength); \
178 node->value.n = node->setValue.n; \
179 node->valueChanged.n = node->setValue.n; \
180 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataMF##type, valueChanged)); \
185 if ((node->setValue.n != 0) || (node->setValue.p != NULL) || (node->valueChanged.n != 0) || (node->valueChanged.p != NULL)) { printf ("PROTO header - initialization set and changed, but not zero??\n"); \
186 node->setValue.n = 0; FREE_IF_NZ(node->setValue.p); \
187 node->valueChanged.n = 0; FREE_IF_NZ(node->valueChanged.p); } \
188 FREE_IF_NZ (node->setValue.p); \
189 FREE_IF_NZ(node->valueChanged.p); \
190 node->setValue.p = MALLOC(mtype, dataSize * node->value.n * elelength); \
191 node->valueChanged.p = MALLOC(mtype, dataSize * node->value.n * elelength); \
192 memcpy(node->setValue.p, node->value.p, dataSize * node->value.n * elelength); \
193 memcpy(node->valueChanged.p, node->value.p, dataSize * node->value.n * elelength); \
194 node->setValue.n = node->value.n; \
195 node->valueChanged.n = node->value.n; \
196 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataMF##type, valueChanged)); \
201 #define CMD_MSFI32(mtype, type,dataSize) void compile_MetadataMF##type (struct X3D_MetadataMF##type *node) { \
204 if META_IS_INITIALIZED { \
205 int count; int changed = FALSE; \
212 if (node->value.n != node->setValue.n) changed = TRUE; \
215 for (count=0; count<node->setValue.n; count++) { \
217 if (node->value.p[count] != node->setValue.p[count]) {changed = TRUE; break; } \
223 FREE_IF_NZ (node->value.p); \
224 FREE_IF_NZ(node->valueChanged.p); \
225 node->value.p = MALLOC(mtype, dataSize * node->setValue.n); \
226 node->valueChanged.p = MALLOC(mtype, dataSize * node->setValue.n); \
227 memcpy(node->value.p, node->setValue.p, dataSize * node->setValue.n); \
228 memcpy(node->valueChanged.p, node->setValue.p, dataSize * node->setValue.n); \
229 node->value.n = node->setValue.n; \
230 node->valueChanged.n = node->setValue.n; \
231 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataMF##type, valueChanged)); \
237 if ((node->setValue.n != 0) || (node->setValue.p != NULL) || (node->valueChanged.n != 0) || (node->valueChanged.p != NULL)) { printf ("PROTO header - initialization set and changed, but not zero??\n"); \
238 node->setValue.n = 0; FREE_IF_NZ(node->setValue.p); \
239 node->valueChanged.n = 0; FREE_IF_NZ(node->valueChanged.p); } \
242 FREE_IF_NZ (node->setValue.p); \
243 FREE_IF_NZ(node->valueChanged.p); \
244 node->setValue.p = MALLOC(mtype, dataSize * node->value.n); \
245 node->valueChanged.p = MALLOC(mtype, dataSize * node->value.n); \
246 memcpy(node->setValue.p, node->value.p, dataSize * node->value.n); \
247 memcpy(node->valueChanged.p, node->value.p, dataSize * node->value.n); \
248 node->setValue.n = node->value.n; \
249 node->valueChanged.n = node->value.n; \
250 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataMF##type, valueChanged)); \
264 #define CMD_MSFL(mtype, type,dataSize) void compile_MetadataMF##type (struct X3D_MetadataMF##type *node) { \
265 int count; int changed = FALSE; \
266 if META_IS_INITIALIZED { \
267 if (node->value.n != node->setValue.n) changed = TRUE; else { \
269 for (count=0; count<node->setValue.n; count++) if (!APPROX(node->value.p[count], node->setValue.p[count])) { changed = TRUE; break; }}\
273 FREE_IF_NZ (node->value.p); \
274 FREE_IF_NZ(node->valueChanged.p); \
275 node->value.p = MALLOC(mtype, dataSize * node->setValue.n); \
276 node->valueChanged.p = MALLOC(mtype, dataSize * node->setValue.n); \
277 memcpy(node->value.p, node->setValue.p, dataSize * node->setValue.n); \
278 memcpy(node->valueChanged.p, node->setValue.p, dataSize * node->setValue.n); \
279 node->value.n = node->setValue.n; \
280 node->valueChanged.n = node->setValue.n; \
281 MARK_EVENT (X3D_NODE(node), offsetof (struct X3D_MetadataMF##type, valueChanged)); \
286 if ((node->setValue.n != 0) || (node->setValue.p != NULL) || (node->valueChanged.n != 0) || (node->valueChanged.p != NULL)) { printf ("PROTO header - initialization set and changed, but not zero??\n"); \
287 node->setValue.n = 0; FREE_IF_NZ(node->setValue.p); \
288 node->valueChanged.n = 0; FREE_IF_NZ(node->valueChanged.p); } \
315 CMD_MULTI(struct
SFRotation *, Rotation,4,sizeof (
float))
316 CMD_MULTI(struct
SFVec2f *, Vec2f,2,sizeof (
float))
317 CMD_MULTI(struct
SFVec3f *, Vec3f,3,sizeof (
float))
318 CMD_MULTI(struct
SFVec4f *, Vec4f,4,sizeof (
float))
319 CMD_MULTI(struct
SFVec2d *, Vec2d,2,sizeof (
double))
320 CMD_MULTI(struct
SFVec3d *,Vec3d,3,sizeof (
double))
321 CMD_MULTI(struct
SFVec4d *,Vec4d,4,sizeof (
double))
322 CMD_MULTI(struct
SFColor *, Color,3,sizeof (
float))
323 CMD_MULTI(struct
SFColorRGBA *, ColorRGBA,4,sizeof (
float))
324 CMD_MULTI(struct
SFMatrix3f *, Matrix3f,9,sizeof (
float))
325 CMD_MULTI(struct
SFMatrix4f *, Matrix4f,16,sizeof (
float))
326 CMD_MULTI(struct
SFMatrix3d *, Matrix3d,9,sizeof (
double))
327 CMD_MULTI(struct
SFMatrix4d *, Matrix4d,16,sizeof (
double))
329 CMD_MSFI32(
int *, Bool, sizeof(
int))
330 CMD_MSFI32(
int *, Int32,sizeof (
int))
331 CMD_MSFI32(struct
X3D_Node **, Node,sizeof (
void *))
332 CMD_MSFL(
double *, Time,sizeof (
double))
333 CMD_MSFL(
float *, Float,sizeof (
float))
334 CMD_MSFL(
double *, Double,sizeof (
double))
335 CMD_MSFI32(struct
Uni_String **, String,sizeof (
void *))
338 void compile_MetadataSFImage (struct
X3D_MetadataSFImage *node){ printf (
"make compile_Metadata %s\n",stringNodeType(node->_nodeType));}
348 int count;
int changed = FALSE;
350 if META_IS_INITIALIZED {
351 if (node->value->len != node->setValue->len) changed = TRUE;
else {
352 for (count=0; count<node->setValue->len; count++)
353 if (node->value->strptr[count] != node->setValue->strptr[count]) changed = TRUE; }
356 node->value->len = node->setValue->len; node->value->strptr = node->setValue->strptr;
357 node->valueChanged->len = node->setValue->len; node->valueChanged->strptr = node->setValue->strptr;
358 node->value->touched = TRUE; node->valueChanged->touched = TRUE;
363 node->valueChanged->len = node->value->len;
364 node->valueChanged->touched = node->value->touched;
365 node->valueChanged->strptr = node->value->strptr;
366 node->setValue->len = node->value->len;
367 node->setValue->touched = node->value->touched;
368 node->setValue->strptr = node->value->strptr;