// ------------------------------------------------------------------------------------------------ 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); } }
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++; } } }