VisualObject *VisualObjectModel::getNewObjectInstance() { if (visualStorm == NULL) { // must initialize first abort(); } // DEBUG //Logger::getInstance()->error("Creating model:"); //Logger::getInstance()->error(filename); //Timer::update(); //int starttime = Timer::getTime(); if (sharedModel == NULL) { Logger::getInstance()->debug("Creating a shared model."); Logger::getInstance()->debug(filename); sharedModel = visualStorm->CreateNewModel(); if (filename != NULL) { // ubermagic... int slen = strlen(filename); bool hasObjectName = false; int objNamePart = 0; for (int i = 0; i < slen; i++) { if (filename[i] == ':') { hasObjectName = true; objNamePart = i; break; } } // do some magic :) if (slen > 4 && strcmp(&filename[slen - 4], ".b3d") == 0) { // bones should not have object name. if (hasObjectName) { Logger::getInstance()->error("VisualObjectModel::getNewObjectInstance - Bonefilename cannot specify object."); return NULL; } if (!sharedModel->LoadBones(filename)) { Logger::getInstance()->error("VisualObjectModel::getNewObjectInstance - Failed to load bones."); Logger::getInstance()->debug(filename); } } else { char real_fname[256]; if (slen < 256) { strcpy(real_fname, filename); } if (hasObjectName) { if (objNamePart > 0) real_fname[objNamePart] = '\0'; // else assert(0); } if (!sharedModel->LoadS3D(real_fname)) { Logger::getInstance()->error("VisualObjectModel::getNewObjectInstance - Failed to load model."); Logger::getInstance()->debug(real_fname); } if (hasObjectName) { // delete all objects except the one we want... LinkedList objlist; Iterator<IStorm3D_Model_Object *> *object_iterator; for(object_iterator = sharedModel->ITObject->Begin(); !object_iterator->IsEnd(); object_iterator->Next()) { IStorm3D_Model_Object *object = object_iterator->GetCurrent(); objlist.append(object); } delete object_iterator; objlist.resetIterate(); bool foundObject = false; while (objlist.iterateAvailable()) { IStorm3D_Model_Object *object = (IStorm3D_Model_Object *)objlist.iterateNext(); const char *objname = object->GetName(); if (objname == NULL || strcmp(&filename[objNamePart + 1], objname) != 0) { //delete object->GetMesh(); sharedModel->Object_Delete(object); } else { if (objname != NULL) foundObject = true; } } if (!foundObject) { Logger::getInstance()->warning("VisualObjectModel::getNewObjectInstance - Model did not contain requested object."); } } } } else { Logger::getInstance()->debug("VisualObjectModel::getNewObjectInstance - Created empty visual object."); } } refCount++; assert(sharedModel != NULL); //IStorm3D_Model *model = visualStorm->CreateNewModel(); IStorm3D_Model *model = NULL; // TODO: don't reload the model!! just copy the bones and stuff // from the shared model!!! // a quick hack method for getting helpers and stuff created... // just load the model again, and then clear the meshes... if (filename != NULL) { //Logger::getInstance()->error("Loading model."); // do some magic :) if (strlen(filename) > 4 && strcmp(&filename[strlen(filename) - 4], ".b3d") == 0) { /* model = visualStorm->CreateNewModel(); if (!model->LoadBones(filename)) { Logger::getInstance()->error("VisualObjectModel::getNewObjectInstance - Failed to load bones."); Logger::getInstance()->debug(filename); } */ model = sharedModel->GetClone(true, true, true); } else { //assert(0); // FIXME: ???????????????????????????????????????????? /* model = visualStorm->CreateNewModel(); model->LoadS3D(filename); */ model = sharedModel->GetClone(true, true, true); } } else { //Logger::getInstance()->debug("VisualObjectModel::getNewObjectInstance - Created empty visual object."); model = visualStorm->CreateNewModel(); } assert(model != NULL); /* // delete loaded objects... LinkedList objlist; Iterator<IStorm3D_Model_Object *> *object_iterator; for(object_iterator = model->ITObject->Begin(); !object_iterator->IsEnd(); object_iterator->Next()) { IStorm3D_Model_Object *object = object_iterator->GetCurrent(); assert(object != NULL); objlist.append(object); } delete object_iterator; objlist.resetIterate(); //while (objlist.iterateAvailable()) while (!objlist.isEmpty()) { //IStorm3D_Model_Object *object = (IStorm3D_Model_Object *)objlist.iterateNext(); IStorm3D_Model_Object *object = (IStorm3D_Model_Object *)objlist.popLast(); //delete object->GetMesh(); model->Object_Delete(object); } // copy shared data to new model... Iterator<IStorm3D_Model_Object *> *del_object_iterator; for (del_object_iterator = sharedModel->ITObject->Begin(); !del_object_iterator->IsEnd(); del_object_iterator->Next()) { IStorm3D_Model_Object *object = del_object_iterator->GetCurrent(); IStorm3D_Mesh *mesh = object->GetMesh(); if(mesh == NULL) continue; IStorm3D_Model_Object *objCopy = model->Object_New(object->GetName()); objCopy->SetNoCollision(object->GetNoCollision()); objCopy->SetNoRender(object->GetNoRender()); objCopy->SetMesh(object->GetMesh()); objCopy->SetPosition(object->GetPosition()); objCopy->SetRotation(object->GetRotation()); if(object->IsLightObject()) objCopy->SetAsLightObject(); } delete del_object_iterator; */ VisualObject *ret = new VisualObject(); ret->model = model; ret->animation = NULL; ret->storm3d = visualStorm; ret->scene = visualStormScene; ret->visualObjectModel = this; model->SetCustomData(ret); // DEBUG //Timer::update(); //int timeelapsed = Timer::getTime() - starttime; //Logger::getInstance()->error("Time elapsed:"); //Logger::getInstance()->error(int2str(timeelapsed)); return ret; }