Guest User

Untitled

a guest
Jan 12th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 9.46 KB | None | 0 0
  1. import std.random;
  2. import std.stdio;
  3. import std.math;
  4.  
  5. import derelict.sdl.sdl;
  6. import derelict.sdl.sdlfuncs;
  7. import derelict.sdl.sdltypes;
  8. import derelict.opengl.gl;
  9. import derelict.opengl.extfuncs;
  10. import derelict.opengl.exttypes;
  11.  
  12. import gl3n.linalg;
  13. import timer;
  14. import shaderstuff;
  15.  
  16. immutable GLuint VertexCount = 4;
  17. immutable GLuint PositionSize = VertexCount * vec2.sizeof;
  18. vec2 PositionData[VertexCount] =
  19.     [  
  20.         vec2(-0.5f,-0.5f),
  21.         vec2( 0.5f,-0.5f),
  22.         vec2( 0.5f, 0.5f),
  23.         vec2(-0.5f, 0.5f)
  24.     ];
  25.  
  26. immutable GLuint ElementCount = 6;
  27. immutable size_t ElementSize = ElementCount * GLushort.sizeof;
  28.  
  29. immutable GLushort ElementData[ElementCount] = [ 0, 1, 2,
  30.                                                  2, 3, 0 ];
  31.  
  32. immutable width = 640;
  33. immutable height = 480;
  34.  
  35.  
  36. GLuint ProgramName = 0;
  37. GLuint ElementBufferName = 0;
  38. GLuint ArrayBufferName = 0;
  39. GLuint VertexArrayName = 0;
  40. GLint UniformMVP = 0;
  41. GLint UniformDiffuse = 0;
  42.  
  43. bool initProgram()
  44. {
  45.     bool validated = true;
  46.  
  47.     if( validated )
  48.     {
  49.         /*
  50.         GLuint vertexShader = createShader(GL_VERTEX_SHADER, "shaders/tess.vert");
  51.         checkError("vertexShader");
  52.         GLuint controlShader = createShader(GL_TESS_CONTROL_SHADER, "shaders/tess.cont");
  53.         checkError("controlShader");
  54.         GLuint evaluationShader = createShader(GL_TESS_EVALUATION_SHADER, "shaders/tess.eval");
  55.         checkError("evaluationShader");
  56.         GLuint fragmentShader = createShader(GL_FRAGMENT_SHADER, "shaders/tess.frag");
  57.         checkError("fragmentShader");
  58.         */
  59.        
  60.         GLuint vertexShader = createShader(GL_VERTEX_SHADER, "shaders/primitive-instancing.vert");
  61.         checkError("vertexShader");
  62.         GLuint geometryshader = createShader(GL_GEOMETRY_SHADER, "shaders/primitive-instancing.geom");
  63.         checkError("geometryshader");
  64.         GLuint fragmentShader = createShader(GL_FRAGMENT_SHADER, "shaders/primitive-instancing.frag");
  65.         checkError("fragmentShader");
  66.        
  67.  
  68.         /*
  69.         writefln("""Shader values
  70.                     vertex  %1$s
  71.                     control %2$s
  72.                     eval    %3$s
  73.                     frag    %4$s
  74.                  """,
  75.                     vertexShader, controlShader, evaluationShader, fragmentShader);
  76.         */
  77.        
  78.         writefln("""Shader values
  79.                    vertex  %1$s
  80.                    geom    %2$s
  81.                    frag    %3$s
  82.                 """,
  83.                     vertexShader, geometryshader, fragmentShader);
  84.        
  85.  
  86.         ProgramName = glCreateProgram();
  87.         writeln("Program idx is ", ProgramName);
  88.  
  89.         glAttachShader(ProgramName, vertexShader);
  90.         //glAttachShader(ProgramName, controlShader);
  91.         //glAttachShader(ProgramName, evaluationShader);
  92.         glAttachShader(ProgramName, geometryshader);
  93.         glAttachShader(ProgramName, fragmentShader);
  94.  
  95.         glDeleteShader(vertexShader);
  96.         //glDeleteShader(controlShader);
  97.         glDeleteShader(geometryshader);
  98.         //glDeleteShader(evaluationShader);
  99.         glDeleteShader(fragmentShader);
  100.        
  101.         glLinkProgram(ProgramName);
  102.         checkError("link program");
  103.  
  104.         validated = checkProgram(ProgramName);
  105.     }
  106.  
  107.     if( validated )
  108.     {
  109.         writeln("Program validated, getting variable locations");
  110.         UniformMVP = glGetUniformLocation(ProgramName, "MVP");
  111.         validated = checkError("get uniform mvp");
  112.         UniformDiffuse = glGetUniformLocation(ProgramName, "Diffuse");
  113.         validated = checkError("get uniform diffuse");
  114.         writefln("""uniforms
  115.                    mvp %1$s
  116.                    dif %2$s
  117.                """,
  118.                 UniformMVP,
  119.                 UniformDiffuse);
  120.  
  121.         glUseProgram(ProgramName);
  122.  
  123.         vec4 diffuse = vec4(1.0f, 0.5f, 0.0f, 1.0f);
  124.  
  125.         glUniform4fv(UniformDiffuse, 1, &diffuse.vector[0]);
  126.         checkError("applying defuse");
  127.         glUseProgram(0);
  128.     }
  129.  
  130.     return validated && checkError("initProgram");
  131. }
  132.  
  133. bool initVertexArray()
  134. {
  135.     glGenVertexArrays(1, &VertexArrayName);
  136.     glBindVertexArray(VertexArrayName);
  137.         glBindBuffer(GL_ARRAY_BUFFER, ArrayBufferName);
  138.         glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, null);
  139.         glEnableVertexAttribArray(0);
  140.         glBindBuffer(GL_ARRAY_BUFFER, 0);
  141.        
  142.         glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBufferName);
  143.     glBindVertexArray(0);
  144.  
  145.     writeln("VertexArrayName ", VertexArrayName);
  146.  
  147.     return checkError("initVertexArray");
  148. }
  149.  
  150. bool initArrayBuffer()
  151. {
  152.    
  153.     glGenBuffers(1, &ElementBufferName);
  154.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ElementBufferName);
  155.         glBufferData(GL_ELEMENT_ARRAY_BUFFER, ElementSize, &ElementData, GL_STATIC_DRAW);
  156.     glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
  157.    
  158.  
  159.     writeln("ElementBufferName ", ElementBufferName);
  160.  
  161.     glGenBuffers(1, &ArrayBufferName);
  162.     glBindBuffer(GL_ARRAY_BUFFER, ArrayBufferName);
  163.         glBufferData(GL_ARRAY_BUFFER, PositionSize, &PositionData, GL_STATIC_DRAW);
  164.     glBindBuffer(GL_ARRAY_BUFFER, 0);
  165.  
  166.     writeln("ArrayBufferName ", ArrayBufferName);
  167.  
  168.     return checkError("initArrayBuffer");
  169. }
  170.  
  171. bool begin()
  172. {
  173.     GLint MajorVersion = 0;
  174.     GLint MinorVersion = 0;
  175.    
  176.     glGetIntegerv(GL_MAJOR_VERSION, &MajorVersion);
  177.     glGetIntegerv(GL_MINOR_VERSION, &MinorVersion);
  178.  
  179.     immutable SAMPLE_MAJOR_VERSION = 4;
  180.     immutable SAMPLE_MINOR_VERSION = 2;
  181.    
  182.     bool validated = (MajorVersion * 10 + MinorVersion) >= (SAMPLE_MAJOR_VERSION * 10 + SAMPLE_MINOR_VERSION);
  183.  
  184.     glEnable(GL_DEPTH_TEST);
  185.  
  186.     writeln("validated ", validated);
  187.  
  188.     if( validated && !initProgram() )
  189.     {
  190.         writeln("Initprogram failed");
  191.         validated = false;
  192.     }
  193.  
  194.     if( validated && !initArrayBuffer() )
  195.     {
  196.         writeln("initArrayBuffer failed");
  197.         validated = false;
  198.     }
  199.  
  200.     if( validated && !initVertexArray() )
  201.     {
  202.         writeln("initVertexArray failed");
  203.         validated = false;
  204.     }
  205.  
  206.     return validated && checkError("begin");
  207. }
  208.  
  209. bool end()
  210. {
  211.     glDeleteVertexArrays(1, &VertexArrayName);
  212.     glDeleteBuffers(1, &ArrayBufferName);
  213.     glDeleteBuffers(1, &ElementBufferName);
  214.     glDeleteProgram(ProgramName);
  215.  
  216.     return checkError("end");
  217. }
  218.  
  219. void display(Timer timer)
  220. {
  221.     //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  222.     mat4 projection = mat4.perspective(4.0f, 3.0f, 45.0f, 0.1f, 10.0f);
  223.     mat4 translate = mat4.translate(0.0f, 0.0f, 1.0f);
  224.     mat4 view;
  225.     view.clear(1.0f);
  226.     //view = mat4.rotatey(45.0f/180.0*PI) * translate * view;
  227.     view = translate;
  228.  
  229.     mat4 model;
  230.     model.clear(1.0f);
  231.     mat4 MVP = projection * view * model;
  232.  
  233.     glViewport(0, 0, width, height);
  234.     glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  235.     //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  236.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  237.  
  238.     glUseProgram(ProgramName);
  239.     glUniformMatrix4fv(UniformMVP, 1, GL_FALSE, &MVP.matrix[0][0]);
  240.  
  241.     glBindVertexArray(VertexArrayName);
  242.         glDrawElements(GL_TRIANGLES, ElementCount, GL_UNSIGNED_SHORT, null);
  243.         //glPatchParameteri(GL_PATCH_VERTICES, VertexCount);
  244.         //glDrawArrays(GL_TRIANGLES, 0, VertexCount);
  245.         checkError("draw arrays");
  246.     glBindVertexArray(0);
  247.  
  248.     glUseProgram(0);
  249.     checkError("display");
  250. }
  251.  
  252. void main()
  253. {
  254.     DerelictSDL.load();
  255.     DerelictGL.load();
  256.  
  257.     SDL_Surface* screen = null;
  258.  
  259.     SDL_Init( SDL_INIT_EVERYTHING );
  260.    
  261.  
  262.     screen = SDL_SetVideoMode(width, height, 32, SDL_OPENGL);
  263.  
  264.     if( screen is null )
  265.     {
  266.         return;
  267.     }
  268.  
  269.     GLint majorVersion;
  270.     GLint minorVersion;
  271.  
  272.  
  273.     writeln("Loading GL 2.1");
  274.     GLVersion loadedVersion = DerelictGL.loadClassicVersions(GLVersion.GL21);
  275.     writeln("Loading max version %1$s", DerelictGL.versionToString(DerelictGL.maxVersion()));
  276.     loadedVersion = DerelictGL.loadModernVersions(GLVersion.GL40);
  277.  
  278.     writefln("max version    %1$s", DerelictGL.maxVersion());
  279.     writefln("loaded version %1$s", loadedVersion);
  280.  
  281.     writefln("we got version %1$s.%2$s", DerelictGL.versionToString(loadedVersion));
  282.     DerelictGL.loadExtensions();
  283.     writeln("loaded extensions");
  284.  
  285.     glGetIntegerv(GL_MAJOR_VERSION, &majorVersion);
  286.     glGetIntegerv(GL_MINOR_VERSION, &minorVersion);
  287.  
  288.     writefln("major %1$s, minor %2$s", majorVersion, minorVersion);
  289.  
  290.     foreach(string s; DerelictGL.loadedExtensionNames())
  291.     {
  292.         writeln(s);
  293.     }
  294.  
  295.     writeln("\nnot loaded extesnions");
  296.     foreach(string s; DerelictGL.notLoadedExtensionNames())
  297.     {
  298.         writeln(s);
  299.     }
  300.  
  301.     writeln();
  302.     writeln("Starting up");
  303.  
  304.     scope(success)
  305.     {
  306.         bool quit = false;
  307.         writeln("writing data");
  308.         writeln("done");
  309.  
  310.         SDL_Event event;
  311.         Timer timer = new Timer;
  312.  
  313.         while(!quit)
  314.         {
  315.             timer.start();
  316.             while( SDL_PollEvent(&event) )
  317.             {
  318.                if( event.type == SDL_QUIT )
  319.                {
  320.                    quit = true;
  321.                }
  322.             }
  323.  
  324.             display(timer);
  325.             SDL_GL_SwapBuffers();
  326.  
  327.             if( timer.getTicks() < 1000/60 )
  328.             {
  329.                 SDL_Delay( 1000/60 - timer.getTicks() );
  330.             }
  331.         }
  332.  
  333.         end();
  334.         SDL_Quit();
  335.     }
  336.     scope(failure)
  337.     {
  338.     }
  339.  
  340.     if( !begin() )
  341.     {
  342.         throw new Exception("init failed");
  343.     }
  344. }
Add Comment
Please, Sign In to add comment