//----------------------------------------------------------------------------- /// Get the root collada DOM element for the given DAE file domCOLLADA* ColladaShapeLoader::getDomCOLLADA(const Torque::Path& path) { daeErrorHandler::setErrorHandler(&sErrorHandler); TSShapeLoader::updateProgress(TSShapeLoader::Load_ReadFile, path.getFullFileName().c_str()); // Check if we can use the last loaded file FileTime daeModifyTime; if (Platform::getFileTimes(path.getFullPath(), NULL, &daeModifyTime)) { if ((path == sLastPath) && (Platform::compareFileTimes(sLastModTime, daeModifyTime) >= 0)) return sDAE.getRoot(path.getFullPath().c_str()); } sDAE.clear(); sDAE.setBaseURI(""); TSShapeLoader::updateProgress(TSShapeLoader::Load_ParseFile, "Parsing XML..."); domCOLLADA* root = readColladaFile(path.getFullPath()); if (!root) { TSShapeLoader::updateProgress(TSShapeLoader::Load_Complete, "Import failed"); sDAE.clear(); return NULL; } sLastPath = path; sLastModTime = daeModifyTime; return root; }
void FrameBuffer::write(DAE &dae, const char *fn) { const Matrix4 m_trans = Matrix4(0.707107, 0.408248, -0.57735, -100.f, -0.707107, 0.408248, -0.57735, -100.f, 0.f, 0.816497, 0.57735, 100.f, 0.f, 0.f, 0.f, 1.f)*rotX_mat(3.14159265358979323846264338327950288419716939937510582097494459230781640628620); daeElement *root = dae.add(fn); if (!root) { if (fprintf(stderr, "Problem preparing to write to temporary file.\n") < 0) perror("fprintf"); exit(0); } time_t now; char date[256]; if (time(&now) == -1 || strftime(date, 256, "%Y-%m-%dT%H:%M:%SZ", gmtime(&now)) == 0) { if (fprintf(stderr, "Getting time failed.\n") < 0) perror("fprintf"); exit(0); } daeElement *asset = root->add("asset"); asset->add("contributor"); asset->add("created")->setCharData(date); asset->add("modified")->setCharData(date); daeElement *visualScene = root->add("library_visual_scenes visual_scene"); visualScene->setAttribute("id", "myscene"); daeElement *node = visualScene->add("node"); node->setAttribute("id", "mynode"); daeElement *instanceGeom = node->add("instance_geometry"); instanceGeom->setAttribute("url", "#mygeom"); daeElement *matbindings = instanceGeom->add("bind_material technique_common"); root->add("scene instance_visual_scene")->setAttribute("url", "#myscene"); daeElement *libMats = root->add("library_materials"); daeElement *libFx = root->add("library_effects"); for (size_t y = 0; y < dim; y++) for (size_t x = 0; x < dim; x++) { ostringstream matid; matid << "mat" << dim * y + x; ostringstream maturl; maturl << "#mat" << dim * y + x; ostringstream fxid; fxid << "fx" << dim * y + x; ostringstream fxurl; fxurl << "#fx" << dim * y + x; ostringstream matsymbol; matsymbol << "MATSYMBOL" << dim * y + x; ostringstream color; color << R[dim * y + x] << ' ' << G[dim * y + x] << ' ' << B[dim * y + x] << " 1"; daeElement *mat = libMats->add("material"); mat->setAttribute("id", matid.str().c_str()); mat->add("instance_effect")->setAttribute("url", fxurl.str().c_str()); daeElement *fx = libFx->add("effect"); fx->setAttribute("id", fxid.str().c_str()); daeElement *technique = fx->add("profile_COMMON technique"); technique->setAttribute("sid", "common"); daeElement *phong = technique->add("phong"); phong->add("diffuse color")->setCharData(color.str()); phong->add("specular color")->setCharData("0 0 0 1"); daeElement *matbinding = matbindings->add("instance_material"); matbinding->setAttribute("symbol", matsymbol.str().c_str()); matbinding->setAttribute("target", maturl.str().c_str()); } daeElement *geom = root->add("library_geometries geometry"); geom->setAttribute("id", "mygeom"); daeElement *mesh = geom->add("mesh"); daeElement *elt; domFloat_array *fa; domAccessor *acc; domListOfFloats floatarray; elt = mesh->add("source"); elt->setAttribute("id", "mypositions"); fa = daeSafeCast<domFloat_array>(elt->add("float_array")); fa->setId("mypositions-array"); fa->setCount(12 * dim * dim); floatarray.clear(); for (size_t y = 0; y < dim; y++) for (size_t x = 0; x < dim; x++) { Point3 p1 = m_trans * Point3((double)x /(double)dim, (double)y /(double)dim, depth[dim * y + x]); Point3 p2 = m_trans * Point3((double)x /(double)dim, (double)(y+1)/(double)dim, depth[dim * y + x]); Point3 p3 = m_trans * Point3((double)(x+1)/(double)dim, (double)(y+1)/(double)dim, depth[dim * y + x]); Point3 p4 = m_trans * Point3((double)(x+1)/(double)dim, (double)y /(double)dim, depth[dim * y + x]); floatarray.append3(p1.x,p1.y,p1.z); floatarray.append3(p2.x,p2.y,p2.z); floatarray.append3(p3.x,p3.y,p3.z); floatarray.append3(p4.x,p4.y,p4.z); } fa->getValue() = floatarray; acc = daeSafeCast<domAccessor>(elt->add("technique_common accessor")); acc->setSource("#mypositions"); acc->setStride(3); acc->setCount(4 * dim * dim); elt = acc->add("param"); elt->setAttribute("name", "X"); elt->setAttribute("type", "float"); elt = acc->add("param"); elt->setAttribute("name", "Y"); elt->setAttribute("type", "float"); elt = acc->add("param"); elt->setAttribute("name", "Z"); elt->setAttribute("type", "float"); elt = mesh->add("source"); elt->setAttribute("id", "mynormals"); fa = daeSafeCast<domFloat_array>(elt->add("float_array")); fa->setId("mynormals-array"); fa->setCount(3); floatarray.clear(); Vector3 back = normalize(inverse(transpose(m_trans)) * Vector3(0.f, 0.f, -1.f)); floatarray.append3(back.x, back.y, back.z); fa->getValue() = floatarray; acc = daeSafeCast<domAccessor>(elt->add("technique_common accessor")); acc->setSource("#mynormals"); acc->setStride(3); acc->setCount(1); elt = acc->add("param"); elt->setAttribute("name", "X"); elt->setAttribute("type", "float"); elt = acc->add("param"); elt->setAttribute("name", "Y"); elt->setAttribute("type", "float"); elt = acc->add("param"); elt->setAttribute("name", "Z"); elt->setAttribute("type", "float"); elt = mesh->add("vertices"); elt->setAttribute("id", "myvertices"); elt = elt->add("input"); elt->setAttribute("semantic", "POSITION"); elt->setAttribute("source", "#mypositions"); for (size_t y = 0; y < dim; y++) for (size_t x = 0; x < dim; x++) { ostringstream matsymbol; matsymbol << "MATSYMBOL" << dim * y + x; domInputLocalOffset *input; domTriangles *triangles = daeSafeCast<domTriangles>(mesh->add("triangles")); triangles->setCount(2); triangles->setMaterial(matsymbol.str().c_str()); input = daeSafeCast<domInputLocalOffset>(triangles->add("input")); input->setSemantic("VERTEX"); input->setOffset(0); input->setSource("#myvertices"); input = daeSafeCast<domInputLocalOffset>(triangles->add("input")); input->setSemantic("NORMAL"); input->setOffset(1); input->setSource("#mynormals"); domP *p = daeSafeCast<domP>(triangles->add("p")); domListOfUInts inds; inds.append2(4 * (dim * y + x) , 0); inds.append2(4 * (dim * y + x) + 1, 0); inds.append2(4 * (dim * y + x) + 3, 0); inds.append2(4 * (dim * y + x) + 1, 0); inds.append2(4 * (dim * y + x) + 2, 0); inds.append2(4 * (dim * y + x) + 3, 0); p->getValue() = inds; } if (!dae.writeAll()) { if (fprintf(stderr, "Problem writing to temporary file.\n") < 0) perror("fprintf"); exit(0); } dae.clear(); }
int main(int argc, const char *argv[]) { if (argc != 6) { if (fprintf(stderr, "Usage: %s [dimension] [bgR] [bgG] [bgB] [texture]\n", argv[0]) < 0) perror("fprintf"); return 0; } buf = new FrameBuffer(atoi(argv[1]), atof(argv[2]), atof(argv[3]), atof(argv[4])); #ifdef WIN32 const char *fn = _tempnam("C:\tmp", "transform"); if (!fn) { perror("_tempnam"); return 0; } #else const char *fn = tmpnam(NULL); if (!fn) { perror("tmpnam"); return 0; } #endif FILE *tmpfile = fopen(fn, "w"); if (!tmpfile) { perror("fopen"); return 0; } int c; while ((c = getchar()) != EOF) if (fputc(c, tmpfile) == EOF) { perror("fputc"); return 0; } if (ferror(tmpfile)) { perror("getchar"); return 0; } if (fclose(tmpfile) == EOF) { perror("fclose"); return 0; } DAE dae; daeElement *root = dae.open(fn); if (!root) { if (fprintf(stderr, "Problem opening temporary file.\n") < 0) perror("fprintf"); return 0; } const daeTArray<daeElementRef> visualSceneChildren = daeSafeCast<domInstanceWithExtra>(root->getChild("scene")->getChild("instance_visual_scene")) ->getUrl().getElement()->getChildren(); for (size_t i = 0; i < visualSceneChildren.getCount(); i++) { const daeElementRef node = visualSceneChildren[i]; if (!strcmp(node->getElementName(), "node")) processNode(daeSafeCast<domNode>(node), dae, argv[5]); } dae.clear(); buf->write(dae, fn); tmpfile = fopen(fn, "r"); if (!tmpfile) { perror("fopen"); return 0; } while ((c = fgetc(tmpfile)) != EOF) if (putchar(c) == EOF) { perror("putchar"); return 0; } if (ferror(tmpfile)) { perror("fgetc"); return 0; } if (fclose(tmpfile) == EOF) { perror("fclose"); return 0; } if (remove(fn)) { perror("remove"); return 0; } }