Prechádzať zdrojové kódy

moved things around in package hierarchy

Zoadian 11 rokov pred
rodič
commit
e911c874e9

+ 10 - 9
source/app.d

@@ -7,19 +7,24 @@ import three;
 import std.experimental.logger;
 
 
+public import derelict.opengl3.gl3;
+public import derelict.glfw3.glfw3;
+public import derelict.anttweakbar.anttweakbar;
+public import derelict.freeimage.freeimage;	
+public import derelict.freetype.ft;
+public import derelict.assimp3.assimp;
 
+public import std.experimental.logger;
 
 
-import three.gl.util;
+import three.gl.renderer;
 
 
 
 import three.window;
 import three.viewport;
 import three.camera;
-import three.renderTarget;
 import three.scene;
-import three.renderer;
 
 
 void main() {
@@ -27,7 +32,7 @@ void main() {
 	Viewport viewport;
 	Scene scene;
 	Camera camera;
-	RenderTarget renderTarget;
+	GlRenderTarget renderTarget;
 	//	OpenGlTiledDeferredRenderer renderer;
 	Renderer renderer;
 	bool keepRunning = true;
@@ -127,11 +132,7 @@ void main() {
 		window.pollEvents();
 		
 		window.makeAktiveRenderWindow();
-		
-		glCheck!glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-		glCheck!glClearDepth(1.0f);
-		glCheck!glClearColor(0, 0.3, 0, 1);
-				
+						
 		renderer.renderOneFrame(scene, camera, renderTarget, viewport);
 
 		debug{ renderer.blitGBufferToScreen(); }

+ 3 - 3
source/three/renderTarget.d → source/gl/renderTarget.d

@@ -1,12 +1,12 @@
-module three.renderTarget;
+module three.gl.renderTarget;
 
 import three.gl.util;
 
-struct RenderTarget {
+struct GlRenderTarget {
 	uint width;
 	uint height;
 	GLuint textureTarget;
-
+	
 	void construct(uint width, uint height) nothrow {
 		this.width = width;
 		this.height = height;

+ 62 - 49
source/three/renderer.d → source/gl/renderer.d

@@ -1,9 +1,7 @@
-module three.renderer;
+module three.gl.renderer;
 
-import three.common;
 import three.scene;
 import three.camera;
-import three.renderTarget;
 import three.viewport;
 import three.mesh;
 
@@ -16,11 +14,12 @@ import three.gl.buffer;
 import three.gl.draw;
 import three.gl.sync;
 import three.gl.util;
+public import three.gl.renderTarget;
 
-enum maxVertices = 1024;
-enum maxIndices = 1024;
-enum maxPerInstanceParams = 1024;
-enum maxIndirectCommands = 1024;
+enum maxVertices = 1 * 1024 * 1024;
+enum maxIndices = 1 * 1024 * 1024;
+enum maxPerInstanceParams = 1 * 1024 * 1024;
+enum maxIndirectCommands = 1 * 1024 * 1024;
 enum bufferCount = 3; //tripple buffering
 enum kOneSecondInNanoSeconds = GLuint64(1000000000);
 
@@ -38,34 +37,43 @@ struct GBuffer {
 	GLuint textureColor;
 	GLuint textureDepthStencil;
 	GLuint fbo;
-
+	
 	void construct(uint width, uint height) nothrow {
 		this.width = width;
 		this.height = height;
 		glCheck!glGenTextures(1, &this.texturePosition);
 		glCheck!glBindTexture(GL_TEXTURE_2D, this.texturePosition);
+		glCheck!glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+		glCheck!glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+//		glCheck!glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+//		glCheck!glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+//		glCheck!glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY);
 		glCheck!glTexStorage2D(GL_TEXTURE_2D, 1, GL_R32F, width, height);
 		glCheck!glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RED, GL_FLOAT, null);	
 		glCheck!glBindTexture(GL_TEXTURE_2D, 0);
-
+		
 		glCheck!glGenTextures(1, &this.textureNormal);	
 		glCheck!glBindTexture(GL_TEXTURE_2D, this.textureNormal);
+		glCheck!glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+		glCheck!glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);	
+//		glCheck!glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+//		glCheck!glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
 		glCheck!glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGB10_A2, width, height);
 		glCheck!glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_FLOAT, null);
 		glCheck!glBindTexture(GL_TEXTURE_2D, 0);
-
+		
 		glCheck!glGenTextures(1, &this.textureColor);	
 		glCheck!glBindTexture(GL_TEXTURE_2D, this.textureColor);
 		glCheck!glTexStorage2D(GL_TEXTURE_2D, 1, GL_RGBA8, width, height);
 		glCheck!glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_RGBA, GL_FLOAT, null);	
 		glCheck!glBindTexture(GL_TEXTURE_2D, 0);
-
+		
 		glCheck!glGenTextures(1, &this.textureDepthStencil);	
 		glCheck!glBindTexture(GL_TEXTURE_2D, this.textureDepthStencil);
 		glCheck!glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH24_STENCIL8, width, height);
 		glCheck!glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, null);
 		glCheck!glBindTexture(GL_TEXTURE_2D, 0);	
-
+		
 		glCheck!glGenFramebuffers(1, &this.fbo);
 		glCheck!glBindFramebuffer(GL_DRAW_FRAMEBUFFER, this.fbo);
 		glCheck!glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + 0, GL_TEXTURE_2D, this.texturePosition, 0);
@@ -94,7 +102,7 @@ struct ShaderPipeline {
 	GLuint pipeline;
 	GLuint vertexShaderGeometryPass;
 	GLuint fragmentShaderGeometryPass;
-
+	
 	void construct(string vertexShaderSource, string fragmentShaderSource) nothrow {
 		glCheck!glGenProgramPipelines(1, &this.pipeline); 
 		
@@ -127,7 +135,7 @@ struct ShaderPipeline {
 		//TODO: add error handling
 		assert(status != 0);
 	}
-
+	
 	void destruct() nothrow {
 		glDeleteProgramPipelines(1, &this.pipeline);
 	}
@@ -202,11 +210,11 @@ struct Renderer {
 	GlShaderStorageBuffer!GlDrawParameter perInstanceParamBuffer; // is filled with draw parameters for each instance each frame. shall be accessed as a ringbuffer
 	GlDispatchIndirectBuffer!GlDrawElementsIndirectCommand dispatchIndirectCommandBuffer; // is filled with DrawElementsIndirectCommand for each mesh each frame. shall be accessed as a ringbuffer
 	GlSyncManager syncManager;
-
+	
 	void construct(uint width, uint height) {
 		GLbitfield createFlags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;//TODO: ?? | GL_MAP_DYNAMIC_STORAGE_BIT;
 		GLbitfield mapFlags = GL_MAP_WRITE_BIT | GL_MAP_PERSISTENT_BIT | GL_MAP_COHERENT_BIT;
-
+		
 		this.gbuffer.construct(width, height);
 		this.shaderPipeline.construct(vertexShaderSource, fragmentShaderSource);
 		this.vertexBuffer.construct(bufferCount * maxVertices, createFlags, mapFlags);
@@ -214,7 +222,7 @@ struct Renderer {
 		this.perInstanceParamBuffer.construct(bufferCount * maxPerInstanceParams, createFlags, mapFlags);
 		this.dispatchIndirectCommandBuffer.construct(bufferCount * maxIndirectCommands, createFlags, mapFlags);
 		this.syncManager.construct();
-
+		
 		glCheck!glEnableVertexAttribArray(0);
 		glCheck!glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, VertexData.sizeof, cast(GLvoid*)0 );
 		glCheck!glEnableVertexAttribArray(1);
@@ -224,7 +232,7 @@ struct Renderer {
 		glCheck!glEnableVertexAttribArray(3);
 		glCheck!glVertexAttribPointer(3, 2, GL_FLOAT, GL_FALSE, VertexData.sizeof, cast(GLvoid*)10 );
 	}
-
+	
 	void destruct() {
 		this.syncManager.destruct();
 		this.dispatchIndirectCommandBuffer.destruct();
@@ -234,37 +242,42 @@ struct Renderer {
 		this.shaderPipeline.destruct();
 		this.gbuffer.destruct();
 	}
-
-//	void uploadModelData(GlArrayBuffer!VertexData vertexBuffer, GlElementArrayBuffer!IndexData indexBuffer, ModelData modelData) {
-//		//TODO: wait for buffer range
-//		//mBufferLockManager.WaitForLockedRange(mStartDestOffset, _vertices.size() * sizeof(Vec2));
-//
-//		// TODO: check if buffers are bound. they should always be bound here!
-//
-//		// we need to store all models in one giant vbo to use glMultiDrawElementsIndirect. 
-//		// TODO: implement triple buffering. -> use vertexBuffer and indexBuffer as giant ring buffers
-//		GLuint vertexBufferOffset = 0;
-//		GLuint indexBufferOffset = 0;
-//		
-//		foreach(meshData; modelData.meshData) {
-//			import std.c.string: memcpy;
-//			//upload vertex data
-//			assert(this.vertexBuffer.length >= meshData.vertexData.length);
-//			memcpy(this.vertexBuffer.data + vertexBufferOffset, meshData.vertexData.ptr, meshData.vertexData.length * VertexData.sizeof);
-//			vertexBufferOffset += meshData.vertexData.length * VertexData.sizeof;
-//			//upload index data
-//			assert(this.indexBuffer.length >= meshData.indexData.length);
-//			memcpy(this.indexBuffer.data + indexBufferOffset, meshData.indexData.ptr, meshData.indexData.length * IndexData.sizeof);
-//			indexBufferOffset += meshData.indexData.length * IndexData.sizeof;
-//		}
-//	}
-
-	void renderOneFrame(ref Scene scene, ref Camera camera, ref RenderTarget renderTarget, ref Viewport viewport) {
-
+	
+	//	void uploadModelData(GlArrayBuffer!VertexData vertexBuffer, GlElementArrayBuffer!IndexData indexBuffer, ModelData modelData) {
+	//		//TODO: wait for buffer range
+	//		//mBufferLockManager.WaitForLockedRange(mStartDestOffset, _vertices.size() * sizeof(Vec2));
+	//
+	//		// TODO: check if buffers are bound. they should always be bound here!
+	//
+	//		// we need to store all models in one giant vbo to use glMultiDrawElementsIndirect. 
+	//		// TODO: implement triple buffering. -> use vertexBuffer and indexBuffer as giant ring buffers
+	//		GLuint vertexBufferOffset = 0;
+	//		GLuint indexBufferOffset = 0;
+	//		
+	//		foreach(meshData; modelData.meshData) {
+	//			import std.c.string: memcpy;
+	//			//upload vertex data
+	//			assert(this.vertexBuffer.length >= meshData.vertexData.length);
+	//			memcpy(this.vertexBuffer.data + vertexBufferOffset, meshData.vertexData.ptr, meshData.vertexData.length * VertexData.sizeof);
+	//			vertexBufferOffset += meshData.vertexData.length * VertexData.sizeof;
+	//			//upload index data
+	//			assert(this.indexBuffer.length >= meshData.indexData.length);
+	//			memcpy(this.indexBuffer.data + indexBufferOffset, meshData.indexData.ptr, meshData.indexData.length * IndexData.sizeof);
+	//			indexBufferOffset += meshData.indexData.length * IndexData.sizeof;
+	//		}
+	//	}
+	
+	void renderOneFrame(ref Scene scene, ref Camera camera, ref GlRenderTarget renderTarget, ref Viewport viewport) nothrow {
+		
+		glCheck!glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+		glCheck!glClearDepth(1.0f);
+		glCheck!glClearColor(0, 0.3, 0, 1);
+		
+		
 		// wait until GPU has finished rendereing from our desired buffer destination
 		//TODO: this.syncManager.WaitForLockedRange(mStartDestOffset, _vertices.size() * sizeof(Vec2));
-
-
+		
+		
 		/*
 		foreach(renderTarget) //framebuffer
 		foreach(pass)
@@ -291,7 +304,7 @@ struct Renderer {
 		// write draw commmands
 		
 		// draw //TODO: pass offset (cast to ptr) into command buffer instead of null
-
+		
 		
 		this.vertexBuffer.bind();
 		this.indexBuffer.bind();
@@ -299,7 +312,7 @@ struct Renderer {
 		this.dispatchIndirectCommandBuffer.bind();
 		
 		glCheck!glMultiDrawElementsIndirect(GL_TRIANGLES, toGlType!(this.indexBuffer.ValueType), null, meshCount, 0);
-
+		
 		//TODO: this.syncManager.LockRange(mStartDestOffset, _vertices.size() * sizeof(Vec2));
 	}
 	

+ 0 - 2
source/three/camera.d

@@ -1,7 +1,5 @@
 module three.camera;
 
-import three.common;
-
 struct Camera {
 	void construct() pure @safe nothrow @nogc {
 	}

+ 0 - 13
source/three/common.d

@@ -1,13 +0,0 @@
-module three.common;
-
-public import derelict.opengl3.gl3;
-public import derelict.glfw3.glfw3;
-public import derelict.anttweakbar.anttweakbar;
-public import derelict.freeimage.freeimage;	
-public import derelict.freetype.ft;
-public import derelict.assimp3.assimp;
-
-public import std.experimental.logger;
-
-alias SoA(T) = T[];
-

+ 3 - 1
source/three/mesh.d

@@ -1,6 +1,8 @@
 module three.mesh;
 
-import three.common;
+public import derelict.assimp3.assimp;
+
+public import std.experimental.logger;
 
 import three.gl.draw;
 

+ 0 - 3
source/three/package.d

@@ -1,10 +1,7 @@
 module three;
 
 public import three.camera;
-public import three.common;
 public import three.mesh;
-public import three.renderer;
-public import three.renderTarget;
 public import three.scene;
 public import three.viewport;
 public import three.window;

+ 0 - 1
source/three/scene.d

@@ -1,6 +1,5 @@
 module three.scene;
 
-import three.common;
 import three.mesh;
 
 struct Scene {

+ 0 - 2
source/three/viewport.d

@@ -1,7 +1,5 @@
 module three.viewport;
 
-import three.common;
-
 struct Viewport {
 	void construct() pure @safe nothrow @nogc {
 	}

+ 3 - 1
source/three/window.d

@@ -1,6 +1,8 @@
 module three.window;
 
-import three.common;
+public import derelict.opengl3.gl3;
+public import derelict.glfw3.glfw3;
+public import std.experimental.logger;
 
 struct Window {
 private: