import math, tri_engine/config, tri_engine/gfx/gl/gl, tri_engine/gfx/tex, tri_engine/gfx/color, tri_engine/math/vec, tri_engine/math/rect, tri_engine/math/circle import strutils type TVert* = tuple[pos: TV2[TR], texCoord: TV2[TR]] TVertAttrib* = object i* : GLuint size* : GLint stride* : GLsizei offset* : GLvoid TVertMode* = enum vmTriStrip = GLtriangleStrip, vmTriFan = GLtriangleFan TZ_range* = range[-100_000..100_000] PPrimitive* = ref object verts* : seq[TVert] indices* : seq[GLushort] arrBufId* : GLuint elemArrBufId* : GLuint tex* : TTex color* : TColor vertMode* : TVertMode z* : int proc newVert*(pos, texCoord: TV2): TVert = (pos, texCoord) proc newVertQuad*(min, minRight, maxLeft, max: TV2[TR]): seq[TVert] = @[newVert(min, newV2()), newVert(minRight, newV2(x=1.0)), newVert(maxLeft, newV2(y=1.0)), newVert(max, newV2xy(1.0)) ] proc newVert*(rect: rect.TRect): seq[TVert] = newVertQuad(rect.min, newV2(rect.max.x, rect.min.y), newV2(rect.min.x, rect.max.y), rect.max) proc newVertAttrib(i: GLuint, size: GLint, stride: GLsizei, offset: GLvoid): TVertAttrib = TVertAttrib(i: i, size: size, stride: stride, offset: offset) proc genBuf*[T](vboTarget, objUsage: GLenum, data: var openarray[T]): GLuint = result = 0.GLuint ?glGenBuffers(1, result.addr) ?glBindBuffer(vboTarget, result) let size = (data.len * T.sizeof).GLsizeiptr ?glBufferData(vboTarget, size, data[0].addr, objUsage) proc newPrimitive*(verts: var seq[TVert], vertMode=vmTriStrip, tex=whiteTex(), color=white(), z: TZ_range=0): PPrimitive = var indices = newSeq[GLushort](verts.len) for i in 0 ..