// ------------------------------------------------------------------------------------------------
void ColladaModelFactory::ProcessXml(xml_node * rootXml, Model3dBuilder * builder)
{
    // process images
    xml_node* images = FindChildByName(rootXml, "library_images");
    for(xml_node* node = FindChildByName(images, "image"); node != NULL; node=FindNextByName(node, "image"))
    {
        ProcessImage(builder, node);
    }

    // process materials
    xml_node* mats = FindChildByName(rootXml, "library_materials");
    for(xml_node* node = FindChildByName(mats, "material"); node != NULL; node=FindNextByName(node, "material"))
    {
        ProcessMaterial(builder, node);
    }

    // process effects
    xml_node* effects = FindChildByName(rootXml, "library_effects");
    for(xml_node* node = FindChildByName(effects, "effect"); node != NULL; node=FindNextByName(node, "effect"))
    {
        ProcessEffect(builder, node);
    }

    // process geometries
    xml_node* geos = FindChildByName(rootXml, "library_geometries");
    for(xml_node* node = FindChildByName(geos, "geometry"); node != NULL; node=FindNextByName(node, "geometry"))
    {
        ProcessGeo(builder, node);
    }

    // process controllers
    ControllerToGeo controllerToGeo;
    xml_node* controllers = FindChildByName(rootXml, "library_controllers");
    for(xml_node* node = FindChildByName(controllers, "controller"); node != NULL; node=FindNextByName(node, "controller"))
    {
        ProcessController(node, &controllerToGeo);
    }

    // process visual scene
    xml_node* scenes = FindChildByName(rootXml, "library_visual_scenes");
    xml_node* scene = FindChildByName(scenes, "visual_scene");  // just grab the 1st visual scene
    if(scene)
    {
        const char * nodeName = GetAttributeText(scene, "id", true);
        if (!nodeName)
        {
            nodeName = "!missing-id!";
        }
        Node * rootNode = builder->m_model->CreateNode(nodeName);

        builder->m_model->SetRoot(rootNode);
        ProcessChildNodes(builder, scene, rootNode, &controllerToGeo);
    }
}
示例#2
0
void Emitter::Process(bool createnew, bool evolve)
{
   int created = 0;
   for (int i = 0; i < MAX_PARTICLES; i++) {
      if (particle[i].active) {
         if (evolve)	{
            // Move particle
            particle[i].x += particle[i].xi/(slowdown*1000);
            particle[i].y += particle[i].yi/(slowdown*1000);

            // Apply gravity
            particle[i].xi+=particle[i].xg;
            particle[i].yi+=particle[i].yg;

            // Fade particle
            particle[i].life -= particle[i].fade;

            // Apply special effect
            ProcessEffect(i);

            // See if particle died
            if (particle[i].life < 0.0f
                && createnew
                && created < MAX_PARTICLES/createrate) {
               NewParticle(i);
               created++;
            }
            else if (particle[i].life < 0.0f)
               particle[i].active = false;
         }
      }
      else if (createnew && created < MAX_PARTICLES/createrate)	{
         NewParticle(i);
         created++;
      }
   }
}