TARGETS operator ~ (TARGETS a) { vector < TARGETS > vts (a.nut.size ()); VT vt; for (int i = 0; i < a.nut.size (); ++i) //将 a.nut 按行(与结构)每个元素取~后 for (int j = 0; j < a.nut[i].size (); ++j) { //竖排(或结构)形成一个targets, 共a.nut.size()个 vt.clear (); vt.push_back (~a.nut[i][j]); vts[i].nut.push_back (vt); } TARGETS tmp = vts[0]; for (int i = 1; i < vts.size (); ++i) //将这些targets连& tmp = tmp & vts[i]; for (int i = 0; i < tmp.nut.size (); ++i) //归整每行(与结构) unique (tmp.nut[i].begin (), tmp.nut[i].end ()); unique (tmp.nut.begin (), tmp.nut.end ()); //归整所有行(或结构) return tmp; }
bool RendererLegacy::BufferStaticMesh(StaticMesh *mesh) { const AttributeSet set = mesh->GetAttributeSet(); bool background = false; bool model = false; //XXX does this really have to support every case. I don't know. if (set == (ATTRIB_POSITION | ATTRIB_NORMAL | ATTRIB_UV0)) model = true; else if (set == (ATTRIB_POSITION | ATTRIB_DIFFUSE)) background = true; else return false; MeshRenderInfo *meshInfo = new MeshRenderInfo(); mesh->SetRenderInfo(meshInfo); const int totalVertices = mesh->GetNumVerts(); //surfaces should have a matching vertex specification!! int indexAdjustment = 0; VertexBuffer *buf = 0; for (StaticMesh::SurfaceIterator surface = mesh->SurfacesBegin(); surface != mesh->SurfacesEnd(); ++surface) { const int numsverts = (*surface)->GetNumVerts(); const VertexArray *va = (*surface)->GetVertices(); int offset = 0; if (model) { ScopedArray<ModelVertex> vts(new ModelVertex[numsverts]); for(int j=0; j<numsverts; j++) { vts[j].position = va->position[j]; vts[j].normal = va->normal[j]; vts[j].uv = va->uv0[j]; } if (!buf) buf = new VertexBuffer(totalVertices); buf->Bind(); buf->BufferData<ModelVertex>(numsverts, vts.Get()); } else if (background) { ScopedArray<UnlitVertex> vts(new UnlitVertex[numsverts]); for(int j=0; j<numsverts; j++) { vts[j].position = va->position[j]; vts[j].color = va->diffuse[j]; } if (!buf) buf= new UnlitVertexBuffer(totalVertices); buf->Bind(); offset = buf->BufferData<UnlitVertex>(numsverts, vts.Get()); } SurfaceRenderInfo *surfaceInfo = new SurfaceRenderInfo(); surfaceInfo->glOffset = offset; surfaceInfo->glAmount = numsverts; (*surface)->SetRenderInfo(surfaceInfo); //buffer indices from each surface, if in use if ((*surface)->IsIndexed()) { assert(background == false); //XXX should do this adjustment in RendererGL2Buffers const unsigned short *originalIndices = (*surface)->GetIndexPointer(); std::vector<unsigned short> adjustedIndices((*surface)->GetNumIndices()); for (int i = 0; i < (*surface)->GetNumIndices(); ++i) adjustedIndices[i] = originalIndices[i] + indexAdjustment; if (!meshInfo->ibuf) meshInfo->ibuf = new IndexBuffer(mesh->GetNumIndices()); meshInfo->ibuf->Bind(); const int ioffset = meshInfo->ibuf->BufferIndexData((*surface)->GetNumIndices(), &adjustedIndices[0]); surfaceInfo->glOffset = ioffset; surfaceInfo->glAmount = (*surface)->GetNumIndices(); indexAdjustment += (*surface)->GetNumVerts(); } } assert(buf); meshInfo->vbuf = buf; mesh->cached = true; return true; }