1 module draw; 2 3 import std.math; 4 5 import des.math.linear; 6 import des.util.stdext.algorithm; 7 import des.util.helpers; 8 9 import des.space; 10 11 import des.gl; 12 import des.assimp; 13 14 class Sphere : GLMeshObject, SpaceNode 15 { 16 mixin SpaceNodeHelper; 17 18 protected: 19 20 CommonGLShaderProgram shader; 21 22 public: 23 24 this( float r, uint u, uint v ) 25 { 26 super( convMesh( smGetSphereMesh( "sphere", r, u, v ) ) ); 27 import std.file; 28 auto ss = parseGLShaderSource( readText( appPath( 29 "..", "data", "shaders", "object.glsl" ) ) ); 30 shader = newEMM!CommonGLShaderProgram( ss ); 31 } 32 33 void draw( Camera cam ) 34 { 35 shader.use(); 36 shader.setUniform!vec4( "col", vec4(1,0,0,1) ); 37 glEnable( GL_PRIMITIVE_RESTART ); 38 glPrimitiveRestartIndex(uint.max); 39 glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); 40 shader.setUniform!mat4( "prj", cam.view(this) ); 41 drawElements(); 42 glDisable( GL_PRIMITIVE_RESTART ); 43 } 44 45 protected: 46 47 GLMeshData convMesh( in SMMesh m ) 48 { 49 GLMeshData md; 50 51 enforce( m.vertices !is null ); 52 53 md.draw_mode = smMeshTypeToGLObjectDrawMode( m.type ); 54 md.num_vertices = cast(uint)( m.vertices.length ); 55 md.indices = m.indices.dup; 56 57 md.attribs = [ vertexAttrib ];//, tcoordAttrib, normalAttrib, tangentAttrib ]; 58 59 md.buffers ~= GLMeshData.Buffer( m.vertices.dup, [0] ); 60 61 //if( m.texcoords !is null ) 62 // md.buffers ~= GLMeshData.Buffer( getTexCoords( m.texcoords[0] ), [1] ); 63 64 //md.buffers ~= GLMeshData.Buffer( m.normals.dup, [2] ); 65 66 //if( m.tangents ) 67 // md.buffers ~= GLMeshData.Buffer( m.tangents.dup, [3] ); 68 69 return md; 70 } 71 72 vec2[] getTexCoords( in SMTexCoord tc ) 73 { 74 enforce( tc.comp == 2 ); 75 enforce( tc.data !is null ); 76 return cast(vec2[])tc.data.dup; 77 } 78 79 const @property 80 { 81 GLAttrib vertexAttrib() { return GLAttrib( "vertex", 0, 3 ); } 82 GLAttrib tcoordAttrib() { return GLAttrib( "tcoord", 1, 2 ); } 83 GLAttrib normalAttrib() { return GLAttrib( "normal", 2, 3 ); } 84 GLAttrib tangentAttrib() { return GLAttrib( "tangent", 3, 3 ); } 85 } 86 87 } 88 89 GLDrawObject.DrawMode smMeshTypeToGLObjectDrawMode( SMMesh.Type tp ) 90 { 91 final switch( tp ) 92 { 93 case SMMesh.Type.POINTS: return GLDrawObject.DrawMode.POINTS; 94 case SMMesh.Type.LINES: return GLDrawObject.DrawMode.LINES; 95 case SMMesh.Type.LINE_STRIP: return GLDrawObject.DrawMode.LINE_STRIP; 96 case SMMesh.Type.TRIANGLES: return GLDrawObject.DrawMode.TRIANGLES; 97 case SMMesh.Type.TRIANGLE_STRIP: return GLDrawObject.DrawMode.TRIANGLE_STRIP; 98 } 99 }