/* Sets the M3dMagicRelease level */ void PutM3dMagicRelease3ds(database3ds *db, releaselevel3ds release) { if (db == NULL) SET_ERROR_RETURN(ERR_INVALID_ARG); if (db->topchunk == NULL) SET_ERROR_RETURN(ERR_INVALID_DATA); if (db->topchunk->tag == M3DMAGIC) { chunk3ds *c; M3dVersion *d; ReplaceOrAddChild3ds(db->topchunk, M3D_VERSION, &c); ON_ERROR_RETURN; d = InitChunkData3ds(c); ON_ERROR_RETURN; switch(release) { case Release13ds: d->version = 1; break; case Release23ds: d->version = 2; break; case Release33ds: d->version = 3; break; case ReleaseNotKnown3ds: d->version = 4; } } }
static void putTagFloat(chunk3ds *pParentChunk, chunktag3ds tag, float3ds *f) { chunk3ds *pGenericChunk; void *pVoid; InitChunk3ds(&pGenericChunk); ON_ERROR_RETURN; pGenericChunk->tag = tag; AddChildOrdered3ds(pParentChunk, pGenericChunk); pVoid = InitChunkData3ds(pGenericChunk); ON_ERROR_RETURN; memcpy(pVoid, f, sizeof(float3ds)); }
/* Sets the MeshRelease level */ void PutMeshRelease3ds(database3ds *db, releaselevel3ds release) { if (db == NULL) SET_ERROR_RETURN(ERR_INVALID_ARG); if (db->topchunk == NULL) SET_ERROR_RETURN(ERR_INVALID_DATA); if ((db->topchunk->tag == M3DMAGIC) || (db->topchunk->tag == CMAGIC)) { chunk3ds *mdata; chunk3ds *c; M3dVersion *d; FindChunk3ds(db->topchunk, MDATA, &mdata); if (mdata == NULL) { InitChunkAs3ds(&mdata, MDATA); AddChildOrdered3ds(db->topchunk, mdata); } ReplaceOrAddChild3ds(mdata, MESH_VERSION, &c); d = InitChunkData3ds(c); switch(release) { case Release13ds: d->version = 1; break; case Release23ds: d->version = 2; break; case Release33ds: d->version = 3; break; case ReleaseNotKnown3ds: d->version = 4; } } }
void PutBackground3ds(database3ds *db, background3ds *bgnd) { chunk3ds *mdata; if(db == NULL || bgnd == NULL) SET_ERROR_RETURN(ERR_INVALID_ARG); if(db->topchunk == NULL) SET_ERROR_RETURN(ERR_INVALID_DATABASE); if (!(db->topchunk->tag == M3DMAGIC || db->topchunk->tag == CMAGIC)) SET_ERROR_RETURN(ERR_WRONG_DATABASE); /* Search for a mesh data chunk */ FindChunk3ds(db->topchunk, MDATA, &mdata); /* If one isn't found, add it to the list */ if (mdata == NULL) { InitChunkAs3ds(&mdata, MDATA); AddChildOrdered3ds(db->topchunk, mdata); } /* if (1) */ /* Put bitmap background chunk. */ { chunk3ds *c; BitMap *d; ReplaceOrAddChild3ds(mdata, BIT_MAP, &c); d = InitChunkData3ds(c); d->bitmap = (bgnd->bitmap.name)? strdup(bgnd->bitmap.name): strdup(""); } /* if (1) */ /* Put the SOLID_BGND chunk */ { chunk3ds *cs, *cc; ColorF *dc; ReplaceOrAddChild3ds(mdata, SOLID_BGND, &cs); dc = InitChunkAndData3ds(&cc, COLOR_F); dc->red = bgnd->solid.color.r; dc->green = bgnd->solid.color.g; dc->blue = bgnd->solid.color.b; AddChild3ds(cs, cc); dc = InitChunkAndData3ds(&cc, LIN_COLOR_F); dc->red = bgnd->solid.color.r; dc->green = bgnd->solid.color.g; dc->blue = bgnd->solid.color.b; AddChild3ds(cs, cc); } /* if (1) */ /* Put the V_GRADIENT chunk */ { chunk3ds *cv, *cc; VGradient *dv; ColorF *dc; ReplaceOrAddChild3ds(mdata, V_GRADIENT, &cv); dv = InitChunkData3ds(cv); dv->gradpercent = bgnd->vgradient.gradpercent; dc = InitChunkAndData3ds(&cc, COLOR_F); dc->red = bgnd->vgradient.top.r; dc->green = bgnd->vgradient.top.g; dc->blue = bgnd->vgradient.top.b; AddChild3ds(cv, cc); dc = InitChunkAndData3ds(&cc, LIN_COLOR_F); dc->red = bgnd->vgradient.top.r; dc->green = bgnd->vgradient.top.g; dc->blue = bgnd->vgradient.top.b; AddChild3ds(cv, cc); dc = InitChunkAndData3ds(&cc, COLOR_F); dc->red = bgnd->vgradient.mid.r; dc->green = bgnd->vgradient.mid.g; dc->blue = bgnd->vgradient.mid.b; AddChild3ds(cv, cc); dc = InitChunkAndData3ds(&cc, LIN_COLOR_F); dc->red = bgnd->vgradient.mid.r; dc->green = bgnd->vgradient.mid.g; dc->blue = bgnd->vgradient.mid.b; AddChild3ds(cv, cc); dc = InitChunkAndData3ds(&cc, COLOR_F); dc->red = bgnd->vgradient.bottom.r; dc->green = bgnd->vgradient.bottom.g; dc->blue = bgnd->vgradient.bottom.b; AddChild3ds(cv, cc); dc = InitChunkAndData3ds(&cc, LIN_COLOR_F); dc->red = bgnd->vgradient.bottom.r; dc->green = bgnd->vgradient.bottom.g; dc->blue = bgnd->vgradient.bottom.b; AddChild3ds(cv, cc); } /* if (1) */ /* Add a use_bitmap_bgnd, use_solid_bgnd, or use_v_gradient */ { chunk3ds *chunk; /* first, find any existing use_* chunks */ FindChunk3ds(mdata, USE_BIT_MAP, &chunk); if (chunk == NULL) { FindChunk3ds(mdata, USE_SOLID_BGND, &chunk); if (chunk == NULL) { FindChunk3ds(mdata, USE_V_GRADIENT, &chunk); } } /* If one was found, delete it */ if (chunk != NULL) { DeleteChunk3ds(chunk); } if (bgnd->bgndused != NoBgnd) { if (chunk == NULL) { InitChunk3ds(&chunk); chunk->tag = USE_BIT_MAP; /* just to help place in order */ AddChildOrdered3ds(mdata,chunk); } /* add the new use_* chunk */ switch (bgnd->bgndused) { case UseBitmapBgnd: chunk->tag = USE_BIT_MAP; break; case UseSolidBgnd: chunk->tag = USE_SOLID_BGND; break; case UseVGradientBgnd: chunk->tag = USE_V_GRADIENT; break; case NoBgnd: chunk->tag = NULL_CHUNK; break; } } } }
/*---------------------------------------------------------------- | | PutLight3ds | | Put chunks in database from light3ds structure. | +-----------------------------------------------------------------*/ void PutLight3ds(database3ds *db, light3ds *light) { chunk3ds *pMdata, *pNamed, *pLight, *pSpot, *current, *xdata; if (db == NULL || light == NULL) SET_ERROR_RETURN(ERR_INVALID_ARG); if (db->topchunk == NULL) SET_ERROR_RETURN(ERR_INVALID_DATABASE); if (!(db->topchunk->tag == M3DMAGIC || db->topchunk->tag == CMAGIC)) SET_ERROR_RETURN(ERR_WRONG_DATABASE); FindChunk3ds(db->topchunk, MDATA, &pMdata); if (pMdata == NULL) { InitChunk3ds(&pMdata); pMdata->tag = MDATA; AddChildOrdered3ds(db->topchunk, pMdata); } /* Discover if the named object already exists */ FindNamedObject3ds(db, light->name, &pNamed); /* If it does, then delete it */ if (pNamed != NULL) { /* First, rescue the xdata chunk if there is one */ FindChunk3ds(pNamed, XDATA_SECTION, ¤t); /* If there is one */ if (current != NULL) { /* Then make a copy of it to reintroduce later */ CopyChunk3ds(current, &xdata); } /* Delete the chunk's children and data, leaving it in the same list order */ DeleteChunk3ds(pNamed); pNamed->tag = NAMED_OBJECT; /* retag the chunk */ } else /* else pNamed needs to be initialized and added */ { InitChunkAs3ds(&pNamed, NAMED_OBJECT); AddChildOrdered3ds(pMdata, pNamed); } { /*--- NAME */ NamedObject *d; d = InitChunkData3ds(pNamed); d->name = strdup(light->name); MakeNamedObjectListDirty3ds(db); } { /*--- N_DIRECT_LIGHT & POSITION */ NDirectLight *d; pLight = kfPutGenericNode(N_DIRECT_LIGHT, pNamed); d = InitChunkData3ds(pLight); memcpy(&(d->lightpos), &(light->pos), sizeof(point3ds)); } /* | Add children to DIRECT_LIGHT */ /*--- COLOR */ { ColorF *d; chunk3ds *pChunk; pChunk = kfPutGenericNode(COLOR_F, pLight); d = InitChunkData3ds(pChunk); d->red = light->color.r; d->green = light->color.g; d->blue = light->color.b; } putTagFloat(pLight, DL_OUTER_RANGE, &light->attenuation.outer); ON_ERROR_RETURN; putTagFloat(pLight, DL_INNER_RANGE, &light->attenuation.inner); ON_ERROR_RETURN; putTagFloat(pLight, DL_MULTIPLIER, &light->multiplier); ON_ERROR_RETURN; if (light->dloff == True3ds) kfPutGenericNode(DL_OFF, pLight); if (light->attenuation.on == True3ds) kfPutGenericNode(DL_ATTENUATE, pLight); /*--- DL_EXCLUDE */ if (light->exclude != NULL && light->exclude->count > 0){ chunk3ds *pChunk; ulong3ds i; DlExclude *d; for(i=0; i<light->exclude->count; i++){ pChunk = kfPutGenericNode(DL_EXCLUDE, pLight); d = InitChunkData3ds(pChunk); d->name = strdup((light->exclude->list)[i].name); } } /*----------------------- | SPOTLIGHT SECTION +-----------------------*/ if (light->spot == NULL) return; { DlSpotlight *d; pSpot = kfPutGenericNode(DL_SPOTLIGHT, pLight); d = InitChunkData3ds(pSpot); memcpy(&d->spotlighttarg, &light->spot->target, sizeof(point3ds)); d->hotspotangle = light->spot->hotspot; d->falloffangle = light->spot->falloff; } putTagFloat(pSpot, DL_SPOT_ROLL, &light->spot->roll); if (light->spot->aspect != 1.0F) putTagFloat(pSpot, DL_SPOT_ASPECT, &light->spot->aspect); /*--- SHADOWS */ if (light->spot->shadows.cast == True3ds) kfPutGenericNode(DL_SHADOWED, pSpot); if (light->spot->shadows.type == UseRayTraceShadow) kfPutGenericNode(DL_RAYSHAD, pSpot); putTagFloat(pSpot, DL_RAY_BIAS, &light->spot->shadows.raybias); /*--- DL_LOCAL_SHADOW2 */ if (light->spot->shadows.local == True3ds) { DlLocalShadow2 *d; chunk3ds *pChunk; kfPutGenericNode(DL_LOCAL_SHADOW, pSpot); pChunk = kfPutGenericNode(DL_LOCAL_SHADOW2, pSpot); d = InitChunkData3ds(pChunk); d->localshadowbias = light->spot->shadows.bias; d->localshadowfilter = light->spot->shadows.filter; d->localshadowmapsize = light->spot->shadows.mapsize; } /*--- CONE */ if (light->spot->cone.type == Rectangular) kfPutGenericNode(DL_SPOT_RECTANGULAR, pSpot); if (light->spot->cone.show == True3ds) kfPutGenericNode(DL_SEE_CONE, pSpot); if (light->spot->cone.overshoot == True3ds) kfPutGenericNode(DL_SPOT_OVERSHOOT, pSpot); /*--- PROJECTOR */ if (light->spot->projector.use == True3ds) { DlSpotProjector *d; chunk3ds *pChunk; pChunk = kfPutGenericNode(DL_SPOT_PROJECTOR, pSpot); d = InitChunkData3ds(pChunk); d->name = strdup(light->spot->projector.bitmap); } }
/*-------------------------------------------------------------------------- | PutCameraMotion3ds | Puts camera keyframe information into database. | | kfcamera3ds--->db | | KFDATA | ... | TARGET | CAMERA_NODE | NODE_ID | NODE_HDR | APP_DATA | POS_TRACK | FOV_TRACK | ROLL_TRACK | | Needs Work: | 1. NodeId: what value? | +--------------------------------------------------------------------------*/ void PutCameraMotion3ds(database3ds *db, kfcamera3ds *kfcam) { chunk3ds *pKfChunk, *pCamChunk, *pTargetChunk = NULL, *pCameraXdata = NULL, *pTargetXdata = NULL; if(db == NULL || kfcam == NULL) SET_ERROR_RETURN(ERR_INVALID_ARG); if (db->topchunk == NULL) SET_ERROR_RETURN(ERR_INVALID_DATA); if (!(db->topchunk->tag == M3DMAGIC) || (db->topchunk->tag == CMAGIC)) SET_ERROR_RETURN(ERR_INVALID_DATA); /*--- Find KFSEG chunk to put keyframe data into */ kfGetKfSeg(db->topchunk, &pKfChunk); ON_ERROR_RETURN; /*--- Destroy old chunks, Copy any XData and reattach it later */ kfExtractXdata(db, kfcam->name, TARGET_NODE_TAG, &pTargetXdata); kfExtractXdata(db, kfcam->name, CAMERA_NODE_TAG, &pCameraXdata); MakeNodeTagListDirty3ds(db); /*--- TARGET TRACK */ if (kfcam->ntkeys>0 && kfcam->tkeys && kfcam->tpos) pTargetChunk = kfPutTargetTrack(kfcam->tparent, kfcam->ntkeys, kfcam->ntflag, kfcam->tkeys, kfcam->tpos, kfcam->name, kfcam->tflags1, kfcam->tflags2, CameraTarget, pKfChunk); pCamChunk = kfPutGenericNode(CAMERA_NODE_TAG, pKfChunk); kfPutNodeId(pCamChunk); kfPutNodeHeader(kfcam->name, kfcam->flags1, kfcam->flags2, kfcam->parent, pCamChunk); if (kfcam->npkeys>0 && kfcam->pkeys && kfcam->pos) kfPutPosTrack(kfcam->npkeys, kfcam->npflag, kfcam->pkeys, kfcam->pos, pCamChunk); /*-- FIELD OF VIEW */ if (kfcam->nfkeys>0 && kfcam->fkeys && kfcam->fov){ FovTrackTag *data; chunk3ds *temp = NULL; int nKeys; /*--- Create the FOV_TRACK_TAG chunk */ InitChunk3ds(&temp); temp->tag = FOV_TRACK_TAG; data = InitChunkData3ds(temp); /*--- Initialize trackhdr field */ data->trackhdr.flags = kfcam->nfflag; nKeys = data->trackhdr.keycount = kfcam->nfkeys; data->trackhdr.nu1 = data->trackhdr.nu2 = 0; /* Not Used */ /*--- Copy headers */ data->keyhdrlist = malloc(nKeys * sizeof(keyheader3ds)); memcpy(data->keyhdrlist, kfcam->fkeys, nKeys * sizeof(keyheader3ds)); /*--- Copy Points */ data->fovanglelist = malloc(nKeys * sizeof(float3ds)); memcpy(data->fovanglelist, kfcam->fov, nKeys * sizeof(float3ds)); /*--- Make if a child of the kframe node */ AddChildOrdered3ds(pCamChunk, temp); } if (kfcam->nrkeys>0 && kfcam->rkeys && kfcam->roll) kfPutRollTrack(kfcam->nrkeys, kfcam->nrflag, kfcam->rkeys, kfcam->roll, pCamChunk); /*--- Replace XData */ if (pCameraXdata) AddChildOrdered3ds(pCamChunk, pCameraXdata); if (pTargetXdata) AddChildOrdered3ds(pTargetChunk, pTargetXdata); }
/* Puts a mesh3ds into the chunk database. Note that this routine will clobber named objects of the same name, except that it will transfer the old xdata onto the new object. If the developer wants to wipe out the XDATA too, he'll have to explicitly delete using the DeleteMesh3ds function */ void PutMesh3ds(database3ds *db, mesh3ds *mesh) { chunk3ds *mdata, *nobj, *ntri, *current; NamedObject *nobjdata; chunk3ds *xdata = NULL; long3ds i; if (db == NULL || mesh == NULL) SET_ERROR_RETURN(ERR_INVALID_ARG); if (db->topchunk == NULL) SET_ERROR_RETURN(ERR_INVALID_DATABASE); if (!(db->topchunk->tag == M3DMAGIC || db->topchunk->tag == CMAGIC)) SET_ERROR_RETURN(ERR_WRONG_DATABASE); FindChunk3ds(db->topchunk, MDATA, &mdata); if (mdata == NULL) { InitChunk3ds(&mdata); ADD_ERROR_RETURN(ERR_PUT_FAIL); mdata->tag = MDATA; AddChildOrdered3ds(db->topchunk, mdata); } /* Discover if the named object already exists */ FindNamedObject3ds(db, mesh->name, &nobj); ON_ERROR_RETURN; /* If it does, then delete it */ if (nobj != NULL) { /* First, rescue the xdata chunk if there is one */ FindChunk3ds(nobj, XDATA_SECTION, ¤t); /* If there is one */ if (current != NULL) { /* Then make a copy of it to reintroduce later */ CopyChunk3ds(current, &xdata); ADD_ERROR_RETURN(ERR_PUT_FAIL); } /* Delete the chunk's children and data, leaving it in the same list order */ DeleteChunk3ds(nobj); nobj->tag = NAMED_OBJECT; /* retag the chunk */ } else /* else nobj needs to be initialized and added */ { InitChunkAs3ds(&nobj, NAMED_OBJECT); ADD_ERROR_RETURN(ERR_PUT_FAIL); AddChildOrdered3ds(mdata, nobj); } /* Copy the mesh name into the chunk */ nobjdata = InitChunkData3ds(nobj); ADD_ERROR_RETURN(ERR_PUT_FAIL); nobjdata->name = strdup(mesh->name); MakeNamedObjectListDirty3ds(db); InitChunk3ds(&ntri); ADD_ERROR_RETURN(ERR_PUT_FAIL); ntri->tag = N_TRI_OBJECT; AddChildOrdered3ds(nobj, ntri); if ((mesh->nvertices > 0) && (mesh->vertexarray != NULL)) { /* Add the point array */ PointArray *d; chunk3ds *temp = NULL; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = POINT_ARRAY; d = InitChunkData3ds(temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); d->vertices = mesh->nvertices; d->pointlist = malloc(sizeof(point3ds)*d->vertices); if (d->pointlist == NULL) SET_ERROR_RETURN(ERR_NO_MEM); memcpy(d->pointlist, mesh->vertexarray, sizeof(point3ds)*d->vertices); AddChildOrdered3ds(ntri, temp); } if (mesh->ntextverts > 0) { TexVerts *d; chunk3ds *temp = NULL; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = TEX_VERTS; d = InitChunkData3ds(temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); d->numcoords = mesh->ntextverts; d->textvertlist = malloc(sizeof(textvert3ds)*d->numcoords); if (d->textvertlist == NULL) SET_ERROR_RETURN(ERR_NO_MEM); memcpy(d->textvertlist, mesh->textarray, sizeof(textvert3ds)*d->numcoords); AddChildOrdered3ds(ntri, temp); } if (mesh->usemapinfo) { MeshTextureInfo *d; chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = MESH_TEXTURE_INFO; d = InitChunkData3ds(temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); d->maptype = mesh->map.maptype; d->xtiling = mesh->map.tilex; d->ytiling = mesh->map.tiley; d->iconpos.x = mesh->map.cenx; d->iconpos.y = mesh->map.ceny; d->iconpos.z = mesh->map.cenz; d->iconscaling = mesh->map.scale; memcpy(d->xmatrix, mesh->map.matrix, sizeof(float3ds)*12); d->iconwidth = mesh->map.pw; d->iconheight = mesh->map.ph; d->cyliconheight = mesh->map.ch; AddChildOrdered3ds(ntri, temp); } if ((mesh->nvflags > 0) && (mesh->vflagarray != NULL)) { PointFlagArray *d; chunk3ds *temp = NULL; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = POINT_FLAG_ARRAY; d = InitChunkData3ds(temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); d->flags = mesh->nvflags; d->flaglist = malloc(sizeof(ushort3ds)*d->flags); if (d->flaglist == NULL) SET_ERROR_RETURN(ERR_NO_MEM); memcpy(d->flaglist, mesh->vflagarray, sizeof(ushort3ds)*d->flags); AddChildOrdered3ds(ntri, temp); } { MeshMatrix *d; chunk3ds *temp = NULL; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = MESH_MATRIX; d = InitChunkData3ds(temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); memcpy(d->xmatrix, mesh->locmatrix, sizeof(float3ds)*12); AddChildOrdered3ds(ntri, temp); } { chunk3ds *temp = NULL; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = MESH_COLOR; InitChunkData3ds(temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); ((MeshColor *)(temp->data))->color = mesh->meshcolor; AddChildOrdered3ds(ntri, temp); } if (mesh->nfaces > 0) { chunk3ds *farr = NULL; FaceArray *d; InitChunk3ds(&farr); ADD_ERROR_RETURN(ERR_PUT_FAIL); farr->tag = FACE_ARRAY; d = InitChunkData3ds(farr); ADD_ERROR_RETURN(ERR_PUT_FAIL); farr->data = d; d->faces = mesh->nfaces; d->facelist = malloc(sizeof(face3ds)*d->faces); if (d->facelist == NULL) SET_ERROR_RETURN(ERR_NO_MEM); memcpy(d->facelist, mesh->facearray, sizeof(face3ds)*d->faces); AddChildOrdered3ds(ntri, farr); if (mesh->nmats > 0) { chunk3ds *matgroup; ushort3ds x; MshMatGroup *d; for (x = 0; x < mesh->nmats; x++) { matgroup = NULL; InitChunk3ds(&matgroup); ADD_ERROR_RETURN(ERR_PUT_FAIL); matgroup->tag = MSH_MAT_GROUP; d = InitChunkData3ds(matgroup); ADD_ERROR_RETURN(ERR_PUT_FAIL); d->matname = strdup(mesh->matarray[x].name); d->faces = mesh->matarray[x].nfaces; if (d->faces > 0) { d->facelist = malloc(sizeof(short3ds)*d->faces); if (d->facelist == NULL) SET_ERROR_RETURN(ERR_NO_MEM); memcpy(d->facelist, mesh->matarray[x].faceindex, sizeof(short3ds)*d->faces); } else { d->facelist = NULL; } AddChildOrdered3ds(farr, matgroup); } } if (mesh->smootharray != NULL) { chunk3ds *smooth = NULL; SmoothGroup *d; InitChunk3ds(&smooth); ADD_ERROR_RETURN(ERR_PUT_FAIL); smooth->tag = SMOOTH_GROUP; d = InitChunkData3ds(smooth); ADD_ERROR_RETURN(ERR_PUT_FAIL); d->groups = mesh->nfaces; d->grouplist = malloc(sizeof(long3ds)*d->groups); if (d->grouplist == NULL) SET_ERROR_RETURN(ERR_NO_MEM); memcpy(d->grouplist, mesh->smootharray, sizeof(long3ds)*d->groups); AddChildOrdered3ds(farr, smooth); } if (mesh->useboxmap) { chunk3ds *boxmap = NULL; MshBoxmap *d; InitChunk3ds(&boxmap); ADD_ERROR_RETURN(ERR_PUT_FAIL); boxmap->tag = MSH_BOXMAP; d = InitChunkData3ds(boxmap); ADD_ERROR_RETURN(ERR_PUT_FAIL); for (i = 0; i < 6; i++) { d->matnames[i] = strdup(mesh->boxmap[i]); } AddChildOrdered3ds(farr, boxmap); } } if (mesh->procdata != NULL) { chunk3ds *procname, *procdata; ProcName *pname; IpasData *pdata; InitChunk3ds(&procname); ADD_ERROR_RETURN(ERR_PUT_FAIL); InitChunk3ds(&procdata); ADD_ERROR_RETURN(ERR_PUT_FAIL); procname->tag = PROC_NAME; procdata->tag = PROC_DATA; pname = InitChunkData3ds(procname); ADD_ERROR_RETURN(ERR_PUT_FAIL); pdata = InitChunkData3ds(procdata); ADD_ERROR_RETURN(ERR_PUT_FAIL); pname->name = strdup(mesh->procname); pdata->size = mesh->procsize; pdata->data = malloc(pdata->size); if (pdata->data == NULL) SET_ERROR_RETURN(ERR_NO_MEM); memcpy(pdata->data, mesh->procdata, pdata->size); AddChildOrdered3ds(ntri, procname); AddChildOrdered3ds(ntri, procdata); } if (mesh->ishidden) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_HIDDEN; AddChildOrdered3ds(nobj, temp); } if (mesh->isvislofter) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_VIS_LOFTER; AddChildOrdered3ds(nobj, temp); } if (mesh->ismatte) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_MATTE; AddChildOrdered3ds(nobj, temp); } if (mesh->isnocast) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_DOESNT_CAST; AddChildOrdered3ds(nobj, temp); } if (mesh->isfast) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_FAST; AddChildOrdered3ds(nobj, temp); } if (mesh->isnorcvshad) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_DONT_RCVSHADOW; AddChildOrdered3ds(nobj, temp); } if (mesh->isfrozen) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_FROZEN; AddChildOrdered3ds(nobj, temp); } if ((mesh->useproc==True3ds) && (mesh->procdata != NULL)) { chunk3ds *temp; InitChunk3ds(&temp); ADD_ERROR_RETURN(ERR_PUT_FAIL); temp->tag = OBJ_PROCEDURAL; AddChildOrdered3ds(nobj, temp); } if (xdata != NULL) { AddChildOrdered3ds(ntri, xdata); } }