//-----------------------------------------------------------------------------
/// 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;
}
Esempio n. 2
0
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();
}
Esempio n. 3
0
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;
  }
}