Graphics::VertexArray *Thruster::CreateGlowGeometry() { Graphics::VertexArray *verts = new Graphics::VertexArray(Graphics::ATTRIB_POSITION | Graphics::ATTRIB_UV0); //create glow billboard for linear thrusters const float w = 0.2; vector3f one(-w, -w, 0.f); //top left vector3f two(-w, w, 0.f); //top right vector3f three(w, w, 0.f); //bottom right vector3f four(w, -w, 0.f); //bottom left //uv coords const vector2f topLeft(0.f, 1.f); const vector2f topRight(1.f, 1.f); const vector2f botLeft(0.f, 0.f); const vector2f botRight(1.f, 0.f); for (int i = 0; i < 5; i++) { verts->Add(one, topLeft); verts->Add(two, topRight); verts->Add(three, botRight); verts->Add(three, botRight); verts->Add(four, botLeft); verts->Add(one, topLeft); one.z += .1f; two.z = three.z = four.z = one.z; } return verts; }
static inline void CopyPos(Graphics::VertexBuffer *vb, const Graphics::VertexArray &va) { PosVert* vtxPtr = vb->Map<PosVert>(Graphics::BUFFER_MAP_WRITE); assert(vb->GetDesc().stride == sizeof(PosVert)); for(Uint32 i=0 ; i<va.GetNumVerts() ; i++) { vtxPtr[i].pos = va.position[i]; } vb->Unmap(); }
void CopyPosColUV0(Graphics::VertexBuffer *vb, const Graphics::VertexArray &va) { PosColUVVert* vtxPtr = vb->Map<PosColUVVert>(Graphics::BUFFER_MAP_WRITE); assert(vb->GetDesc().stride == sizeof(PosColUVVert)); for(Uint32 i=0 ; i<va.GetNumVerts() ; i++) { vtxPtr[i].pos = va.position[i]; vtxPtr[i].col = va.diffuse[i]; vtxPtr[i].uv = va.uv0[i]; } vb->Unmap(); }
void Disk::SetupVertexBuffer(const Graphics::VertexArray& vertices, Graphics::Renderer *r) { PROFILE_SCOPED() //Create vtx & index buffers and copy data VertexBufferDesc vbd; vbd.attrib[0].semantic = ATTRIB_POSITION; vbd.attrib[0].format = ATTRIB_FORMAT_FLOAT3; vbd.numVertices = vertices.GetNumVerts(); vbd.usage = BUFFER_USAGE_STATIC; m_vertexBuffer.reset(r->CreateVertexBuffer(vbd)); m_vertexBuffer->Populate(vertices); }
Graphics::VertexArray *Thruster::CreateThrusterGeometry() { Graphics::VertexArray *verts = new Graphics::VertexArray(Graphics::ATTRIB_POSITION | Graphics::ATTRIB_UV0); //zero at thruster center //+x down //+y right //+z backwards (or thrust direction) const float w = 0.5f; vector3f one(0.f, -w, 0.f); //top left vector3f two(0.f, w, 0.f); //top right vector3f three(0.f, w, 1.f); //bottom right vector3f four(0.f, -w, 1.f); //bottom left //uv coords const vector2f topLeft(0.f, 1.f); const vector2f topRight(1.f, 1.f); const vector2f botLeft(0.f, 0.f); const vector2f botRight(1.f, 0.f); //add four intersecting planes to create a volumetric effect for (int i=0; i < 4; i++) { verts->Add(one, topLeft); verts->Add(two, topRight); verts->Add(three, botRight); verts->Add(three, botRight); verts->Add(four, botLeft); verts->Add(one, topLeft); one.ArbRotate(vector3f(0.f, 0.f, 1.f), DEG2RAD(45.f)); two.ArbRotate(vector3f(0.f, 0.f, 1.f), DEG2RAD(45.f)); three.ArbRotate(vector3f(0.f, 0.f, 1.f), DEG2RAD(45.f)); four.ArbRotate(vector3f(0.f, 0.f, 1.f), DEG2RAD(45.f)); } return verts; }
void DistanceFieldFont::AddGlyph(Graphics::VertexArray &va, const vector2f &pos, const Glyph& g, vector2f &bounds) { vector3f norm(0.f, 0.f, 1.f); const vector2f &uv = g.uv; //uv offset const float uWidth = g.uvSize.x; const float vHeight = g.uvSize.y; const float w = g.size.x; const float h = g.size.y; va.Add(vector3f(pos.x, pos.y, 0.f), norm, vector2f(uv.x, uv.y+vHeight)); va.Add(vector3f(pos.x + w, pos.y, 0.f), norm, vector2f(uv.x+uWidth, uv.y+vHeight)); va.Add(vector3f(pos.x, pos.y + h, 0.f), norm, vector2f(uv.x, uv.y)); va.Add(vector3f(pos.x, pos.y + h, 0.f), norm, vector2f(uv.x, uv.y)); va.Add(vector3f(pos.x + w, pos.y, 0.f), norm, vector2f(uv.x+uWidth, uv.y+vHeight)); va.Add(vector3f(pos.x + w, pos.y + h, 0.f), norm, vector2f(uv.x+uWidth, uv.y)); bounds.x = std::max(bounds.x, pos.x + w); bounds.y = std::max(bounds.y, pos.y + h); }
void ModelViewer::DrawBackground() { m_renderer->SetDepthWrite(false); m_renderer->SetBlendMode(Graphics::BLEND_SOLID); m_renderer->SetOrthographicProjection(0.f, 1.f, 0.f, 1.f, -1.f, 1.f); m_renderer->SetTransform(matrix4x4f::Identity()); static Graphics::VertexArray va(Graphics::ATTRIB_POSITION | Graphics::ATTRIB_DIFFUSE); va.Clear(); const Color4f top = Color::BLACK; const Color4f bottom = Color4f(0.3f); va.Add(vector3f(0.f, 0.f, 0.f), bottom); va.Add(vector3f(1.f, 0.f, 0.f), bottom); va.Add(vector3f(1.f, 1.f, 0.f), top); va.Add(vector3f(0.f, 0.f, 0.f), bottom); va.Add(vector3f(1.f, 1.f, 0.f), top); va.Add(vector3f(0.f, 1.f, 0.f), top); m_renderer->DrawTriangles(&va, Graphics::vtxColorMaterial); }
void StaticGeometry::DrawBoundingBox(Graphics::Renderer *r, const Aabb &bb) { vector3f min(bb.min.x, bb.min.y, bb.min.z); vector3f max(bb.max.x, bb.max.y, bb.max.z); vector3f fbl(min.x, min.y, min.z); //front bottom left vector3f fbr(max.x, min.y, min.z); //front bottom right vector3f ftl(min.x, max.y, min.z); //front top left vector3f ftr(max.x, max.y, min.z); //front top right vector3f rtl(min.x, max.y, max.z); //rear top left vector3f rtr(max.x, max.y, max.z); //rear top right vector3f rbl(min.x, min.y, max.z); //rear bottom left vector3f rbr(max.x, min.y, max.z); //rear bottom right Graphics::VertexArray *vts = new Graphics::VertexArray(Graphics::ATTRIB_POSITION | Graphics::ATTRIB_DIFFUSE); Color c(Color::WHITE); //vertices vts->Add(fbl, c); //0 vts->Add(fbr, c); //1 vts->Add(ftl, c); //2 vts->Add(ftr, c); //3 vts->Add(rtl, c); //4 vts->Add(rtr, c); //5 vts->Add(rbl, c); //6 vts->Add(rbr, c); //7 RefCountedPtr<Graphics::Material> mat(Graphics::vtxColorMaterial); Graphics::Surface surf(Graphics::TRIANGLES, vts, mat); //indices std::vector<unsigned short> &ind = surf.GetIndices(); //Front face ind.push_back(3); ind.push_back(1); ind.push_back(0); ind.push_back(0); ind.push_back(2); ind.push_back(3); //Rear face ind.push_back(7); ind.push_back(5); ind.push_back(6); ind.push_back(6); ind.push_back(5); ind.push_back(4); //Top face ind.push_back(4); ind.push_back(5); ind.push_back(3); ind.push_back(3); ind.push_back(2); ind.push_back(4); //bottom face ind.push_back(1); ind.push_back(7); ind.push_back(6); ind.push_back(6); ind.push_back(0); ind.push_back(1); //left face ind.push_back(0); ind.push_back(6); ind.push_back(4); ind.push_back(4); ind.push_back(2); ind.push_back(0); //right face ind.push_back(5); ind.push_back(7); ind.push_back(1); ind.push_back(1); ind.push_back(3); ind.push_back(5); r->SetWireFrameMode(true); r->DrawSurface(&surf); r->SetWireFrameMode(false); }