Bool ApplinkImporter::createObjects() { BaseDocument* doc = GetActiveDocument(); Int32 vertCnt = 0; const Matrix tM(Vector(0.0f, 0.0f, 0.0f), Vector(1.0f, 0.0f, 0.0f), Vector(0.0f, 1.0f, 0.0f), Vector(0.0f, 0.0f, -1.0f)); StatusSetText("Create objects..."); for(unsigned int i = 0; i < groups.size(); i++) { Vector *vadr = 0;// vertex adress CPolygon *padr = 0;// polygon adress Group gr = this->groups[i]; if(this->pSet.impReplace) { BaseObject* bo = doc->SearchObject(gr.groupName); if(bo) { BaseObject::Free(bo); } } PolygonObject* pObj = PolygonObject::Alloc(gr.numGVertices, gr.numGFaces); if (!pObj){ return false;} pObj->SetName(this->groups[i].groupName); //GePrint("Name group: " + pObj->GetName()); GePrint("V count: " + String::IntToString((Int32)gr.numGVertices)); GePrint("Poly count: " + String::IntToString((Int32)gr.numGFaces)); vadr = pObj->GetPointW(); padr = pObj->GetPolygonW(); for (int p = 0; p < gr.numGFaces; p++) { padr[p] = CPolygon(gr.faces[p].vp[0] - vertCnt, gr.faces[p].vp[1] - vertCnt, gr.faces[p].vp[2] - vertCnt, gr.faces[p].vp[3] - vertCnt); //GePrint("poly " + LongToString(p) + ": " + LongToString(padr[p].a) + ", " + LongToString(padr[p].b) + ", " + LongToString(padr[p].c) + ", " + LongToString(padr[p].d)); } for (int v = 0; v < gr.numGVertices; v++) { vadr[v] = tM * this->verticies[v + vertCnt] ; //GePrint("vert " + LongToString(v) + ": " + LongToString(vadr[v].x) + ", " + LongToString(vadr[v].y) + ", " + LongToString(vadr[v].z)); } //// import UV if(ApplinkImporter::pSet.impUV && gr.numGTVertices > 0) { UVWStruct us; UVWTag* uvwtag = nullptr; uvwtag = UVWTag::Alloc(gr.numGFaces); if(!uvwtag) return false; for (Int32 p = 0; p < gr.numGFaces; p++) { us = UVWStruct(this->uvw[gr.faces[p].vt[0]], this->uvw[gr.faces[p].vt[1]], this->uvw[gr.faces[p].vt[2]], this->uvw[gr.faces[p].vt[3]]); void *dataptr = uvwtag->GetDataAddressW(); uvwtag->Set(dataptr, p, us); } pObj->InsertTag(uvwtag, NULL); uvwtag->Message(MSG_UPDATE); } ////// insert phongTag if (!pObj->MakeTag(Tphong)) GePrint("Error on inserting phongTag. Object: " + pObj->GetName()); /////add materials, textures and poly clusters if(this->pSet.impMat) { String selTagName = ""; if(this->matArray.size() == 1) { this->InsertTextureTag(pObj, this->matArray[0].Name, selTagName); } else if(this->matArray.size() > 1) { this->InsertTextureTag(pObj, this->matArray[0].Name, selTagName); CPolygon ps; SelectionTag* polyTag = NULL; for (Int32 c = 1; c < this->matArray.size(); c++) { polyTag = SelectionTag::Alloc(Tpolygonselection); if(!polyTag) return false; selTagName = "Selection " + String::IntToString(c); polyTag->SetName(selTagName); BaseSelect* sel = polyTag->GetBaseSelect(); for (Int32 p = 0; p < gr.numGFaces; p++) { if(gr.polyMatIdx[p] == c) { sel->Select(p); } } pObj->InsertTag(polyTag, this->GetLastTag(pObj)); polyTag->Message(MSG_UPDATE); this->InsertTextureTag(pObj, this->matArray[c].Name, selTagName); } } } doc->InsertObject(pObj, NULL, NULL); pObj->Message(MSG_UPDATE); ModelingCommandData md; md.doc = doc; md.op = pObj; if(!SendModelingCommand(MCOMMAND_REVERSENORMALS, md)) return false; pObj = 0; vertCnt += gr.numGVertices; } return true; }
BaseObject *Objectify::GetVirtualObjects(BaseObject *op, HierarchyHelp *hh) { BaseDocument *doc = op->GetDocument(); BaseContainer *data = op->GetDataInstance(); BaseObject* obj = (BaseObject*)data->GetLink(CTT_OBJECT_LINK,doc,Obase); LONG crntFrame = doc->GetTime().GetFrame(doc->GetFps()); if (!obj) return NULL; if (obj->GetType() != Ospline){ return NULL; } // start new list op->NewDependenceList(); // check cache for validity and check master object for changes Bool dirty = op->CheckCache(hh) || op->IsDirty(DIRTYFLAGS_DATA); // if child list has been modified if (!dirty) dirty = !op->CompareDependenceList(); // mark child objects as processed op->TouchDependenceList(); dirty = dirty || (prevFrame != crntFrame); prevFrame = crntFrame; // if no change has been detected, return original cache if (!dirty) return op->GetCache(hh); SplineObject* spline = (SplineObject*) obj; AutoAlloc<SplineHelp> splineHelp; StatusSetText("Collecting points"); float positioAlongSpline = data->GetReal(POSITION_ALONG_SPLINE,0.5); positioAlongSpline /= 10000.0f; positioAlongSpline = positioAlongSpline > 1.0 ? 1.0: positioAlongSpline; positioAlongSpline = positioAlongSpline < 0.0 ? 0.0: positioAlongSpline; cout<<positioAlongSpline<<endl; vector<vector<float> > points; for (LONG i = 0; i < spline->GetSegmentCount(); i++){ Vector p = spline->GetSplinePoint(positioAlongSpline, i); vector<float> point; point.push_back(p.x); point.push_back(p.y); point.push_back(p.z); points.push_back(point); } StatusSetText("Collected "+LongToString(points.size())+" points"); ksearchNeighbors= data->GetLong(TRIANGULATION_MAX_NEIGHBORS, 100); gp3SearchRadius = data->GetReal(TRIANGULATION_MAX_SEARCH_RADIUS,30.); gp3MaxNeighbors = data->GetLong(KSEARCH_NEIGHBORS, 20); gp3Mu = data->GetReal(KSEARCH_MU, 0.5); vector<vector<float> > surfacePoints; vector<vector<int> > triIndxs; StatusSetBar(0); StatusSetText("Triangulating"); bool useMls = data->GetBool(USE_MLS, false); tri.computeSurface(points, surfacePoints, triIndxs, ksearchNeighbors, gp3SearchRadius, gp3MaxNeighbors, gp3Mu, useMls); StatusSetBar(100); StatusSetText("Got "+LongToString(triIndxs.size())+" triangles"); if (triIndxs.size() == 0){ return NULL; } PolygonObject* myPoly = PolygonObject::Alloc(surfacePoints.size(),triIndxs.size()); Vector* ppoints = myPoly->GetPointW(); vector<float> sp; for (int t = 0; t < surfacePoints.size()-2; t += 3) { sp = surfacePoints[t]; ppoints[t+0] = Vector(sp[0],sp[1],sp[2]); sp = surfacePoints[t+1]; ppoints[t+1] = Vector(sp[0],sp[1],sp[2]); sp = surfacePoints[t+2]; ppoints[t+2] = Vector(sp[0],sp[1],sp[2]); } for (int t = 0; t < triIndxs.size(); t ++) { myPoly->GetPolygonW()[t] = CPolygon(triIndxs[t][0], triIndxs[t][1], triIndxs[t][2], triIndxs[t][2]); } StatusClear(); myPoly->Message(MSG_UPDATE); return ToPoly(myPoly); BaseThread* bt=hh->GetThread(); BaseObject* main = BaseObject::Alloc(Onull); SplineObject* emptySpline = SplineObject::Alloc(0, SPLINETYPE_LINEAR); ModelingCommandData mcd; mcd.doc = doc; mcd.op = emptySpline; if(!SendModelingCommand(MCOMMAND_JOIN, mcd)){ return NULL; } Error: return NULL; }