Skip to content

Instantly share code, notes, and snippets.

@milasudril
Created September 1, 2022 18:18
Show Gist options
  • Save milasudril/d41f9d7c4f357e9d2de8b5c6cf56d43b to your computer and use it in GitHub Desktop.
Save milasudril/d41f9d7c4f357e9d2de8b5c6cf56d43b to your computer and use it in GitHub Desktop.
IDENTIFICATION DIVISION.
PROGRAM-ID. traingle.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 GL_COLOR_BUFFER_BIT USAGE BINARY-INT UNSIGNED VALUE 16384.
01 GL_VERSION USAGE BINARY-INT UNSIGNED VALUE 7938.
01 GL_STATIC_DRAW USAGE BINARY-INT UNSIGNED VALUE 35044.
01 GL_ARRAY_BUFFER USAGE BINARY-INT UNSIGNED VALUE 34962.
01 GL_FLOAT USAGE BINARY-INT UNSIGNED VALUE 5126.
01 GL_TRIANGLES USAGE BINARY-INT UNSIGNED VALUE 4.
01 GL_VERTEX_SHADER USAGE BINARY-INT UNSIGNED VALUE H'8B31'.
01 GL_FRAGMENT_SHADER USAGE BINARY-INT UNSIGNED VALUE H'8B30'.
01 GLFW_SAMPLES USAGE BINARY-INT UNSIGNED VALUE 135181.
01 GLFW_GL_VERSION_MAJOR USAGE BINARY-INT UNSIGNED VALUE 139266.
01 GLFW_GL_VERSION_MINOR USAGE BINARY-INT UNSIGNED VALUE 139267.
01 GLFW_GL_PROFILE USAGE BINARY-INT UNSIGNED VALUE 139272.
01 GLFW_GL_CORE_PROFILE USAGE BINARY-INT UNSIGNED VALUE 204801.
01 vertex_shader_src PICTURE X(1024).
01 fragment_shader_src PICTURE X(1024).
01 res USAGE BINARY-INT SIGNED.
01 mainwin.
02 ref USAGE POINTER.
02 width USAGE BINARY-INT VALUE 640.
02 height USAGE BINARY-INT VALUE 480.
02 mouse_cursor.
03 x USAGE COMPUTATIONAL-2.
03 y USAGE COMPUTATIONAL-2.
02 ogl_version USAGE POINTER.
02 vertex_shader_id USAGE BINARY-INT UNSIGNED.
02 fragment_shader_id USAGE BINARY-INT UNSIGNED.
02 shader_program_id USAGE BINARY-INT UNSIGNED.
02 vertex_array_id USAGE BINARY-INT UNSIGNED.
02 vbo_id USAGE BINARY-INT UNSIGNED.
02 vertex_table OCCURS 3 TIMES.
03 x USAGE COMPUTATIONAL-1.
03 y USAGE COMPUTATIONAL-1.
03 z USAGE COMPUTATIONAL-1.
02 highlilght.
03 x USAGE COMPUTATIONAL-1.
03 y USAGE COMPUTATIONAL-1.
PROCEDURE DIVISION.
CALL "glfwInit" returning res.
IF res IS EQUAL TO 0
DISPLAY "glfwInit failed!"
STOP RUN.
CALL "glfwWindowHint" using
by value GLFW_SAMPLES,
by value 4,
returning nothing.
CALL "glfwWindowHint" using
by value GLFW_GL_VERSION_MAJOR,
by value 4,
returning nothing.
CALL "glfwWindowHint" using
by value GLFW_GL_VERSION_MINOR,
by value 6,
returning nothing.
CALL "glfwWindowHint" using
by value GLFW_GL_PROFILE,
by value GLFW_GL_CORE_PROFILE,
returning nothing.
CALL "glfwCreateWindow" using
by value width,
by value height,
by content z"Hello, World",
by reference NULL,
by reference NULL,
returning ref.
IF ref IS EQUAL TO NULL
DISPLAY "Failed to create window"
CALL "glfwTerminate" returning nothing
STOP RUN.
CALL "glfwMakeContextCurrent" using
by value ref returning nothing.
CALL "glGetString"
using by value GL_VERSION,
returning ogl_version.
DISPLAY "OpenGL version: " WITH NO ADVANCING.
* Need to call C function puts to print a c style string
CALL "puts" using by value ogl_version.
PERFORM load_shader_program.
MOVE 0 to vertex_array_id.
CALL "glGenVertexArrays" using
by value 1,
by reference vertex_array_id,
returning nothing.
CALL "glBindVertexArray" using
by value vertex_array_id
returning nothing.
CALL "glCreateBuffers" using
by value 1,
by reference vbo_id,
returning nothing.
MOVE -1 TO x of vertex_table(1).
MOVE -1 TO y of vertex_table(1).
MOVE 0 TO z of vertex_table(1).
MOVE 1 TO x of vertex_table(2).
MOVE -1 TO y of vertex_table(2).
MOVE 0 TO z of vertex_table(2).
MOVE 0 TO x of vertex_table(3).
MOVE 1 TO y of vertex_table(3).
MOVE 0 TO z of vertex_table(3).
CALL "glNamedBufferData" using
by value vbo_id,
by value 36,
by value address of vertex_table(1),
by value GL_STATIC_DRAW,
returning nothing.
MOVE 0 TO res.
PERFORM render_scene UNTIL res = 1.
DISPLAY "Exiting".
CALL "glfwMakeContextCurrent" using
by reference NULL returning nothing.
CALL "glfwDestroyWindow" using
by value ref returning nothing.
CALL "glfwTerminate" returning nothing.
STOP RUN.
render_scene.
CALL "glfwWindowShouldClose" using
by value ref returning res.
CALL "glfwGetCursorPos" using
by value ref,
by reference x of mouse_cursor,
by reference y of mouse_cursor,
returning nothing.
COMPUTE x of highlilght = 2 * (x of mouse_cursor / width - 0.5).
COMPUTE y of highlilght = 2 * (0.5 - y of mouse_cursor / height).
CALL "glClear" using by value GL_COLOR_BUFFER_BIT.
CALL "glUniform2fv" using
by value 1,
by value 1,
by value address of highlilght,
returning nothing.
CALL "glEnableVertexAttribArray" using
by value 0,
returning nothing.
CALL "glBindBuffer" using
by value GL_ARRAY_BUFFER,
by value vbo_id
returning nothing.
CALL "glVertexAttribPointer" using
by value 0,
by value 3,
by value GL_FLOAT,
by value 0,
by value 0,
by reference NULL,
returning nothing.
CALL "glDrawArrays" using
by value GL_TRIANGLES,
by value 0,
by value 3,
returning nothing.
CALL "glfwSwapBuffers" using by value ref returning nothing.
CALL "glfwPollEvents" returning nothing.
load_shader_program.
MOVE FUNCTION CONCATENATE("#version 430 core", x'0a',
"layout (location = 0) in vec3 aPos;",
"out vec3 vertexPos;",
"out vec4 vertexColor;",
"void main()",
"{",
"gl_Position = vec4(aPos, 1.0);",
"vertexColor = 0.16*vec4(1, 0.25, 0.5, 1.0);",
"vertexPos = aPos;",
"}",x'00'
) to vertex_shader_src.
MOVE FUNCTION CONCATENATE("#version 430 core", x'0a',
"out vec4 FragColor;",
"in vec4 vertexColor;",
"in vec3 vertexPos;",
"layout (location = 1) uniform vec2 lightpos;"
"void main()",
"{",
"vec3 d = vec3(lightpos, 0.25) - vertexPos;",
"float distance = sqrt( dot(d, d) );",
"vec4 light = vec4(1, 1, 1, 1);",
"FragColor = vertexColor*light/distance;"
"}",x'00') to fragment_shader_src.
CALL "glCreateShader" using by value GL_VERTEX_SHADER
returning vertex_shader_id.
CALL "glShaderSource" using
by value vertex_shader_id,
by value 1,
by reference address of vertex_shader_src,
by reference NULL,
returning nothing.
CALL "glCompileShader" using by value vertex_shader_id.
CALL "glCreateShader" using by value GL_FRAGMENT_SHADER
returning fragment_shader_id.
CALL "glShaderSource" using
by value fragment_shader_id,
by value 1,
by reference address of fragment_shader_src,
by reference NULL,
returning nothing.
CALL "glCompileShader" using
by value fragment_shader_id returning nothing.
CALL "glCreateProgram" returning shader_program_id.
CALL "glAttachShader" using
by value shader_program_id,
by value vertex_shader_id,
returning nothing.
CALL "glAttachShader" using
by value shader_program_id,
by value Fragment_shader_id,
returning nothing.
CALL "glLinkProgram" using by value shader_program_id
returning nothing.
CALL "glUseProgram" using by value shader_program_id
returning nothing.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment