package.path = package.path..";"..RL.GetBasePath().."../resources/lib/?.lua"

Util = require( "utillib" )
Vec2 = require( "vector2" )

local res = Vec2:new( 1024, 720 )
local winScale = 1
local winSize = res:scale( winScale )
local monitor = 0

local triangle = {
	texture = {
		id = -1,
		data = nil,
		size = Vec2:new(),
		mipmaps = 0,
		format = 0,
	},
	vao = -1,
	vbos = {
		positions = -1,
		texcoords = -1,
		colors = -1,
	},
}

local vertexShader = [[
	#version 330 core
	layout (location = 0) in vec3 aPos;
	layout (location = 1) in vec4 aColor;
	layout (location = 2) in vec2 aTexCoord;
	
	out vec4 flagColor;
	out vec2 fragTexCoord;
	
	void main() {
		flagColor = aColor;
		fragTexCoord = aTexCoord;
		gl_Position = vec4( aPos, 1.0 );
	}
]]
local fragmentShader = [[
	#version 330 core
	out vec4 FragColor;
	
	in vec4 flagColor;
	in vec2 fragTexCoord;

	uniform sampler2D ourTexture;

	void main() {
		FragColor = texture( ourTexture, fragTexCoord ) * flagColor;
	}
]]

local shaderProgram = -1

-- Let's make our own custom texture.
local function loadTexture( path )
	local image = RL.LoadImage( path )

	triangle.texture.data = RL.GetImageData( image )
	triangle.texture.size = Vec2:new( RL.GetImageSize( image ) )
	triangle.texture.format = RL.GetImageFormat( image )
	triangle.texture.mipmaps = RL.GetImageMipmaps( image )

	triangle.texture.id = RL.rlLoadTexture(
		triangle.texture.data,
		triangle.texture.size,
		triangle.texture.format,
		triangle.texture.mipmaps
	)
end

local function createTriangle()
	loadTexture( RL.GetBasePath().."../resources/images/monkey_tex.png" )
	-- Set texture to shader uniform.
	local shaderLoc = RL.rlGetLocationUniform( shaderProgram, "ourTexture" )

	RL.rlEnableShader( shaderProgram )
	-- NOTE: Default texture is always activated as GL_TEXTURE0 so our slot will be 1.
	RL.rlSetUniformSampler( shaderLoc, triangle.texture.id )
	RL.rlDisableShader()

	-- Setup triangle buffers.
	triangle.vao = RL.rlLoadVertexArray()
	RL.rlEnableVertexArray( triangle.vao )

	-- Positions.
	local vertexBuffer = RL.LoadBuffer(
		{
			-0.5, -0.5, 0.0,
			0.5, -0.5, 0.0,
			0.0,  0.5, 0.0
		},
		RL.BUFFER_FLOAT
	)
	triangle.vbos.positions = RL.rlLoadVertexBuffer( vertexBuffer, false )
	RL.rlSetVertexAttribute( 0, 3, RL.RL_FLOAT, false, 0, 0 )
	RL.rlEnableVertexAttribute( 0 )

	-- Colors.
	local colors = RL.LoadBuffer(
		{
			1, 0, 0, 1,
			0, 1, 0, 1,
			0, 0, 1, 1
		},
		RL.BUFFER_FLOAT
	)
	triangle.vbos.colors = RL.rlLoadVertexBuffer( colors, false )
	RL.rlSetVertexAttribute( 1, 4, RL.RL_FLOAT, false, 0, 0 )
	RL.rlEnableVertexAttribute( 1 )

	-- Texcoords.
	local texcoors = RL.LoadBuffer(
		{
			0, 0,
			1, 0,
			0.5, 1,
		},
		RL.BUFFER_FLOAT
	)
	triangle.vbos.texcoors = RL.rlLoadVertexBuffer( texcoors, false )
	RL.rlSetVertexAttribute( 2, 2, RL.RL_FLOAT, false, 0, 0 )
	RL.rlEnableVertexAttribute( 2 )

	-- Disable.
	RL.rlDisableVertexBuffer()
	RL.rlDisableVertexArray()
end

function RL.init()
	local monitorPos = Vec2:new( RL.GetMonitorPosition( monitor ) )
	local monitorSize = Vec2:new( RL.GetMonitorSize( monitor ) )

	RL.SetWindowTitle( "RLGL Hello Triangle" )
	RL.SetWindowState( RL.FLAG_WINDOW_RESIZABLE )
	RL.SetWindowState( RL.FLAG_VSYNC_HINT )
	RL.SetWindowSize( winSize )
	RL.SetWindowPosition( { monitorPos.x + monitorSize.x / 2 - winSize.x / 2, monitorPos.y + monitorSize.y / 2 - winSize.y / 2 } )

	RL.rlViewport( { 0, 0, res.x ,res.y } )
	shaderProgram = RL.rlLoadShaderCode( vertexShader, fragmentShader )

	createTriangle()
end

local function drawTriangle()
	-- Texture slot 0 is the default texture.
	RL.rlActiveTextureSlot( 1 )
	RL.rlEnableTexture( triangle.texture.id )

	RL.rlEnableShader( shaderProgram )

	RL.rlEnableVertexArray( triangle.vao )
	RL.rlDrawVertexArray( 0, 3 )

	-- Disable.
	RL.rlDisableVertexArray()
	RL.rlDisableVertexBuffer()
	RL.rlDisableTexture()
	RL.rlDisableShader()
end

function RL.draw()
	RL.ClearBackground( RL.BLACK )
	drawTriangle()
end

function RL.exit()
	RL.rlUnloadVertexArray( triangle.vao )
	RL.rlUnloadVertexBuffer( triangle.vbos.positions )
	RL.rlUnloadVertexBuffer( triangle.vbos.colors )
	RL.rlUnloadVertexBuffer( triangle.vbos.texcoords )
	RL.rlUnloadTexture( triangle.texture.id )
end
