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 }