{ "name": "example", "targetPath": "bin", "targetType": "executable", "sourcePaths": [ "src" ], "dependencies": { "des": ">=1.3.0" } }
import des.app; // SDL: , , , , GL import window; // void main() { auto app = new DesApp; // , , , app.addWindow({ return new MainWindow; }); // while( app.isRuning ) app.step(); // , }
module window; import des.app; import draw; // Sphere import camera; // MCamera // class MainWindow : DesWindow { protected: MCamera cam; // Sphere obj; // , /+ , DesApp OpenGL : , GL, +/ override void prepare() { cam = new MCamera; obj = newEMM!Sphere( 1, 12, 12 ); // // , connect( draw, { obj.draw( cam ); } ); connect( key, &keyControl ); // connect( mouse, &(cam.mouseReaction) ); // connect( event.resized, (ivec2 sz) { cam.ratio = cast(float)sz.w / sz.h; } ); } // void keyControl( in KeyboardEvent ke ) { if( ke.scan == ke.Scan.ESCAPE ) app.quit(); // DesApp, } public: // title , , this() { super( "example", ivec2(800,600), false ); } }
obj = newEMM!Sphere( 1, 12, 12 );
auto bar = new Bar; foo.registerChildEMM( bar );
auto bar = foo.newEMM!Bar();
draw.connect( this.newSlot( { obj.draw( cam ); } );
module draw; import std.math; import des.math.linear; // , import des.util.stdext.algorithm; // amap array( map ... ) import des.util.helpers; // appPath -- import des.space; // , SpaceNode, import des.gl; // OpenGL class Sphere : GLSimpleObject, SpaceNode { /+ SpaceNode self_mtr matrix +/ mixin SpaceNodeHelper; protected: // GLBuffer pos, ind; void prepareBuffers() { // auto loc = shader.getAttribLocations( "pos" ); // createArrayBuffer createIndexBuffer GLSimpleObject, GLObject pos = createArrayBuffer; // ind = createIndexBuffer; // // setAttribPointer( pos, loc[0], 3, GLType.FLOAT ); // vec3[] buf; vec3 sp( vec2 a, float R ) { return spheric(a) * R; } buf ~= amap!(a=>a+vec3(0,0,0))( amap!(a=>sp(a,R))( planeCoord( uivec2( resU, resV/2 ), vec2(0,PI*2), vec2(PI,PI/2) ) ) ); buf ~= amap!(a=>a-vec3(0,0,0))( amap!(a=>sp(a,R*0.9))( planeCoord( uivec2( resU, resV/2 ), vec2(0,PI*2), vec2(PI/2,PI) ) ) ); // pos.setData( buf ); // ind.setData( triangleStripPlaneIndex( uivec2( resU+1, resV+2 ), uint.max ) ); } // uint resU, resV; float R; public: this( float r, uint u, uint v ) { R = r; resU = u; resV = v; import std.file; super( newEMM!CommonShaderProgram( // parseShaderSource( // 1 readText( // appPath( "..", "data", "object.glsl" ) // )))); prepareBuffers(); } void draw( Camera cam ) { // shader.setUniform!col4( "col", col4(1,0,0,1) ); glEnable( GL_PRIMITIVE_RESTART ); glPrimitiveRestartIndex(uint.max); glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); // shader.setUniform!mat4( "prj", cam.projection.matrix * cam.resolve(this) ); // drawElements( DrawMode.TRIANGLE_STRIP ); glDisable( GL_PRIMITIVE_RESTART ); } } // vec2[] planeCoord( uivec2 res, vec2 x_size=vec2(0,1), vec2 y_size=vec2(0,1) ) { vec2[] ret; float sx = (x_size[1] - x_size[0]) / res.u; float sy = (y_size[1] - y_size[0]) / res.v; foreach( y; 0 .. res.y+1 ) foreach( x; 0 .. res.x+1 ) ret ~= vec2( x_size[0] + sx * x, y_size[0] + sy * y ); return ret; } vec3 spheric( in vec2 c ) pure { return vec3( cos(cx) * sin(cy), sin(cx) * sin(cy), cos(cy) ); } uint[] triangleStripPlaneIndex( uivec2 res, uint term ) { uint[] ret; foreach( y; 0 .. res.y-1 ) { ret ~= [ y*res.x, (y+1)*res.x ]; foreach( x; 1 .. res.x ) ret ~= [ y*res.x+x, (y+1)*res.x+x ]; ret ~= term; } return ret; }
//### vert #version 330 in vec4 pos; uniform mat4 prj; void main() { gl_Position = prj * pos; } //### frag #version 330 uniform vec4 col; out vec4 color; void main() { color = col; }
module camera; import std.math; import des.space; import des.app; class MCamera : SimpleCamera { protected: vec3 orb; vec2 rot; float rotate_coef = 80.0f; float offset_coef = 50.0f; float y_angle_limit = PI_2 - 0.01; public: this() { super(); orb = vec3( 5, 1, 3 ); look_tr.target = vec3(0,0,0); look_tr.up = vec3(0,0,1); near = 0.001; updatePos(); } // void mouseReaction( in MouseEvent ev ) { // if( ev.type == MouseEvent.Type.WHEEL ) moveFront( -ev.whe.y * 0.1 ); if( ev.type == ev.Type.MOTION ) { // if( ev.isPressed( ev.Button.LEFT ) ) { auto frel = vec2( ev.rel ) * vec2(-1,1); auto angle = frel / rotate_coef; addRotate( angle ); } // if( ev.isPressed( ev.Button.MIDDLE ) ) { auto frel = vec2( ev.rel ) * vec2(-1,1); auto offset = frel / offset_coef * sqrt( orb.len ); moveCenter( offset ); } } } protected: void moveFront( float dist ) { orb += orb * dist; if( orb.len2 < 1 ) orb = orb.e; updatePos(); } void addRotate( in vec2 angle ) { rot = normRotate( rot + angle ); orb = vec3( cos(rot.x) * cos(rot.y), sin(rot.x) * cos(rot.y), sin(rot.y) ) * orb.len; updatePos(); } void moveCenter( in vec2 offset ) { auto lo = (look_tr.matrix * vec4(offset,0,0)).xyz; look_tr.target += lo; updatePos(); } void updatePos() { pos = orb + look_tr.target; } vec2 normRotate( in vec2 r ) { vec2 ret = r; if( ret.y > y_angle_limit ) ret.y = y_angle_limit; if( ret.y < -y_angle_limit ) ret.y = -y_angle_limit; return ret; } }
Source: https://habr.com/ru/post/248119/
All Articles