Пример #1
0
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;
}
Пример #2
0
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;
}