void VertexArray::SetTo2DQuad(float x1, float y1, float x2, float y2, float u1, float v1, float u2, float v2, float z) { float vcorners[12]; float uvs[8]; int bfaces[6]; SetVertexData2DQuad(x1,y1,x2,y2,u1,v1,u2,v2, vcorners, uvs, bfaces); for (int i = 2; i < 12; i += 3) vcorners[i] = z; SetFaces(bfaces, 6); SetVertices(vcorners, 12); SetTexCoordSets(1); SetTexCoords(0, uvs, 8); }
void VertexArray::Add( const unsigned char newcol[], int newcolcount, const float newnorm[], int newnormcount, const float newvert[], int newvertcount, const int newfaces[], int newfacecount, const float newtc[], int newtccount) { assert(texcoords.size() == 1); SetFaces(newfaces, newfacecount, faces.size(), vertices.size() / 3); SetVertices(newvert, newvertcount, vertices.size()); SetNormals(newnorm, newnormcount, normals.size()); SetColors(newcol, newcolcount, colors.size()); SetTexCoords(0, newtc, newtccount, texcoords[0].size()); }
void VertexArray::SetTo2DButton(float x, float y, float w, float h, float sidewidth, bool flip) { float vcorners[12*3]; float uvs[8*3]; int bfaces[6*3]; //y1 = 1.0 - y1; //y2 = 1.0 - y2; Vec2 corner1; Vec2 corner2; Vec2 dim; dim.Set(w,h); Vec2 center; center.Set(x,y); corner1 = center - dim*0.5; corner2 = center + dim*0.5; float x1 = corner1[0]; float y1 = corner1[1]; float x2 = corner2[0]; float y2 = corner2[1]; if (flip) { float y3 = y1; y1 = y2; y2 = y3; } //left SetVertexData2DQuad(x1-sidewidth,y1,x1,y2, 0,0,0.5,1, vcorners, uvs, bfaces); //center SetVertexData2DQuad(x1,y1,x2,y2, 0.5,0,0.5,1, &(vcorners[12]), &(uvs[8]), &(bfaces[6]), 4); //right SetVertexData2DQuad(x2,y1,x2+sidewidth,y2, 0.5,0,1,1, &(vcorners[12*2]), &(uvs[8*2]), &(bfaces[6*2]), 8); SetFaces(bfaces, 6*3); SetVertices(vcorners, 12*3); SetTexCoordSets(1); SetTexCoords(0, uvs, 8*3); }
void VertexArray::SetToBillboard(float x1, float y1, float x2, float y2) { int bfaces[6]; bfaces[0] = 0; bfaces[1] = 1; bfaces[2] = 2; bfaces[3] = 0; bfaces[4] = 2; bfaces[5] = 3; SetFaces(bfaces, 6); float normals[12]; for (int i = 0; i < 12; i+=3) { normals[i] = 0; normals[i+1] = 0; normals[i+2] = 1; } SetNormals(normals, 12); //build this: //x1, y1, 0 //x2, y1, 0 //x2, y2, 0 //x1, y2, 0 float verts[12]; verts[2] = verts[5] = verts[8] = verts[11] = 0.0; verts[0] = verts[9] = x1; verts[3] = verts[6] = x2; verts[1] = verts[4] = y1; verts[7] = verts[10] = y2; SetVertices(verts, 12); float tc[8]; tc[0] = tc[1] = tc[3] = tc[6] = 0.0; tc[2] = tc[4] = tc[5] = tc[7] = 1.0; SetTexCoordSets(1); SetTexCoords(0, tc, 8); }
void FaceObject::DoCreateNode(SceneView* view, optixu::Transform& transform, optixu::GeometryGroup& group) { optixu::Context context = view->GetContext(); if (m_group.get()) { group = m_group; return; } auto model = view->GetScene()->GetModel(); group = context->createGeometryGroup(); m_curvedFaceInstance = context->createGeometryInstance(); m_planarFaceInstance = context->createGeometryInstance(); optixu::Geometry curvedGeometry = model->GetPlanarFaceGeometry(); optixu::Geometry planarGeometry = model->GetCurvedFaceGeometry(); m_planarFaceInstance->setGeometry(planarGeometry); m_curvedFaceInstance->setGeometry(curvedGeometry); m_group = group; group->setChildCount(2); group->setChild(0, m_planarFaceInstance); group->setChild(1, m_curvedFaceInstance); // Somehow sharing the acceleration structure didnt' work. Revisit if // performance indicates. m_group->setAcceleration(context->createAcceleration("Sbvh", "Bvh")); m_facesEnabledBuffer = view->GetScene()->GetModel()->GetFacesEnabledBuffer(); std::vector<int> temp(m_faceIds.begin(), m_faceIds.end()); SetFaces(temp, true); }
void VertexArray::SetTo2DBox(float x, float y, float w, float h, float marginwidth, float marginheight, float clipx) { const unsigned int quads = 9; float vcorners[12*quads]; float uvs[8*quads]; int bfaces[6*quads]; //y1 = 1.0 - y1; //y2 = 1.0 - y2; Vec2 corner1; Vec2 corner2; Vec2 dim; dim.Set(w,h); Vec2 center; center.Set(x,y); corner1 = center - dim*0.5; corner2 = center + dim*0.5; Vec2 margin; margin.Set(marginwidth, marginheight); float lxmax = std::max((corner1-margin)[0],std::min(clipx,corner1[0])); float cxmax = std::max(corner1[0],std::min(clipx,corner2[0])); float rxmax = std::max(corner2[0],std::min(clipx,(corner2+margin)[0])); float lumax = (lxmax-(corner1-margin)[0])/(corner1[0]-(corner1-margin)[0])*0.5; float rumax = (rxmax-corner2[0])/((corner2+margin)[0]-corner2[0])*0.5+0.5; //upper left SetVertexData2DQuad((corner1-margin)[0],(corner1-margin)[1],lxmax,corner1[1], 0,0,lumax,0.5, vcorners,uvs,bfaces); //upper center SetVertexData2DQuad(corner1[0],(corner1-margin)[1],cxmax,corner1[1], 0.5,0,0.5,0.5, &(vcorners[12*1]),&(uvs[8*1]),&(bfaces[6*1]),4*1); //upper right SetVertexData2DQuad(corner2[0],(corner1-margin)[1],rxmax,corner1[1], 0.5,0,rumax,0.5, &(vcorners[12*2]),&(uvs[8*2]),&(bfaces[6*2]),4*2); //center left SetVertexData2DQuad((corner1-margin)[0],corner1[1],lxmax,corner2[1], 0,0.5,lumax,0.5, &(vcorners[12*3]),&(uvs[8*3]),&(bfaces[6*3]),4*3); //center center SetVertexData2DQuad(corner1[0],corner1[1],cxmax,corner2[1], 0.5,0.5,0.5,0.5, &(vcorners[12*4]),&(uvs[8*4]),&(bfaces[6*4]),4*4); //center right SetVertexData2DQuad(corner2[0],corner1[1],rxmax,corner2[1], 0.5,0.5,rumax,0.5, &(vcorners[12*5]),&(uvs[8*5]),&(bfaces[6*5]),4*5); //lower left SetVertexData2DQuad((corner1-margin)[0],corner2[1],lxmax,(corner2+margin)[1], 0,0.5,lumax,1, &(vcorners[12*6]),&(uvs[8*6]),&(bfaces[6*6]),4*6); //lower center SetVertexData2DQuad(corner1[0],corner2[1],cxmax,(corner2+margin)[1], 0.5,0.5,0.5,1, &(vcorners[12*7]),&(uvs[8*7]),&(bfaces[6*7]),4*7); //lower right SetVertexData2DQuad(corner2[0],corner2[1],rxmax,(corner2+margin)[1], 0.5,0.5,rumax,1, &(vcorners[12*8]),&(uvs[8*8]),&(bfaces[6*8]),4*8); SetFaces(bfaces, 6*quads); SetVertices(vcorners, 12*quads); SetTexCoordSets(1); SetTexCoords(0, uvs, 8*quads); }