Exemple #1
0
GLuint initTexBufferDepth(GLuint id, int w, int h) {
	//GLuint id = initTexBuffer(w, h, GL_DEPTH_COMPONENT32F, GL_DEPTH_COMPONENT, GL_FLOAT);
	
	if(!id) {
		glGenTextures(1, &id);
	}
	
	glBindTexture(GL_TEXTURE_2D, id);
	glexit(" -- tex buffer creation");

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
	glexit("a pre tex buffer creation");
	//glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_RED);
	
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);

	glexit("b pre tex buffer creation");
//	glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH24_STENCIL8, w, h, 0, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, NULL);
 	glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, w, h, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
	glexit("tex buffer creation");
	

	//glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_LUMINANCE);
	return id;
}
Exemple #2
0
void checkCursor(GameState* gs, InputState* is) {
	
	unsigned short rgb[4];
	glexit("pre selection buff");
	
	glReadBuffer(GL_COLOR_ATTACHMENT2);
	glexit("selection buff");
	//printf("cursor pixels: %f, %f\n", is->cursorPosPixels.x, is->cursorPosPixels.y);
	glReadPixels(
		is->cursorPosPixels.x,
		is->cursorPosPixels.y,
		1,
		1,
		GL_RGB_INTEGER,
		GL_UNSIGNED_SHORT,
		&rgb);
	glexit("read selection");
	
	gs->cursorPos.x = rgb[0];
	gs->cursorPos.y = rgb[1];
	
// 	printf("mx: %d, my: %d, x: %d, y: %d\n", (int)is->cursorPosPixels.x, (int)is->cursorPosPixels.y, rgb[0], rgb[1]);
	
	if(is->clickButton == 3 && rgb[2] == 1) {
		gs->lookCenter.x = gs->cursorPos.x;
		gs->lookCenter.y = gs->cursorPos.y;
	}
	
}
Exemple #3
0
void drawFSQuad() {
	
	glBindVertexArray(fsQuadVAO);
	glBindBuffer(GL_ARRAY_BUFFER, fsQuadVBO);
	glexit("quad vbo");
	
	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
	glexit("quad draw");
	
}
Exemple #4
0
GLuint* initFBOTextures(int w, int h, FBOTexConfig* cfg) {
	int len, i;
	GLuint* texids;
	
	// calc length of the config array
	for(len = 0; 
		cfg[len].internalType != 0 
		&& cfg[len].format != 0 
		&& cfg[len].size != 0; len++);
	
	texids = calloc(1, len + 1);
	
	printf("len %d\n" ,len);
	printf("w %d\n" ,w);
	printf("h %d\n" ,h);
	
	glGenTextures(len, texids);
	
	// allocate storage for each texture
	for(i = 0; i < len; i++) {
		
		glBindTexture(GL_TEXTURE_2D, texids[i]);
		
		printf("texid %d\n", texids[i]);
		
		glexit(" -- tex buffer creation");

		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
		glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
		
		printf("it %d, f %d, s %d \n", cfg[i].internalType, cfg[i].format, cfg[i].size);
		// just depth textures for this one
		if(cfg[i].format == GL_DEPTH_COMPONENT) { printf("depth \n");
			glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
		}
		glexit("pre tex buffer creation");
		
		glTexImage2D(GL_TEXTURE_2D, 0, cfg[i].internalType, w, h, 0, cfg[i].format, cfg[i].size, NULL);
		glexit("tex buffer creation");
	}
	
	glBindTexture(GL_TEXTURE_2D, 0);
	glexit("end of fb tex creation");
	
	return texids;
}
Exemple #5
0
void destroyFBO(Framebuffer* fb) {
	
	glDeleteFramebuffers(1, &fb->fb);
	glexit("delete fb");
	
	fb->fb = 0;
}
Exemple #6
0
GLuint initTexBuffer(GLuint id, int w, int h, GLenum internalType, GLenum format, GLenum size) {
	if(!id) {
		glGenTextures(1, &id);
	}
	glBindTexture(GL_TEXTURE_2D, id);
		glexit(" -- tex buffer creation");

	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glexit("pre tex buffer creation");
	glTexImage2D(GL_TEXTURE_2D, 0, internalType, w, h, 0, format, size, NULL);
	glexit("tex buffer creation");
	
	return id;
}
Exemple #7
0
// don't do dumb things like pass in null pointers or empty lists. you get what you deserve if you do.
void destroyFBOTextures(GLuint* texids) {
	int len = 0;
	
	while(texids[len] != 0) len++;
	
	glDeleteTextures(len, texids);
	glexit("delete fbo textures");
}
Exemple #8
0
// shitty temporary function for rendering ui
void renderWindowTmp(float x, float y, int index, float glow) {
	
	
	msPush(&uiMat);
	
	msTrans3f(x, y, 0, &uiMat);
	msScale3f(50, 50, 50, &uiMat);
	
	
	glUniform1i(glGetUniformLocation(windowProg->id, "texIndex"), index);
	glexit("");
	
	glUniform1f(glGetUniformLocation(windowProg->id, "glow"), glow);
	glexit("");
	
	GLuint zz = glGetUniformLocation(windowProg->id, "mMVP");
	glexit("");
	glUniformMatrix4fv(zz, 1, GL_FALSE, (float*)msGetTop(&uiMat));
	glexit("");
	
	// activate vbo's
	glBindVertexArray(windowVAO);
	glexit("");
	glBindBuffer(GL_ARRAY_BUFFER, windowVBO);
	glexit("ui vbo");
	
	// draw geometry
	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
	glexit("ui draw");
	
	
	msPop(&uiMat);
}
Exemple #9
0
// temporary, for now, ish
void uiPreRenderSetup() {
	
	glUseProgram(windowProg->id);
	glexit("ui prog");
	// use program
	// activate vao
	// set up textures
	
	
}
Exemple #10
0
/*

The ui is drawn on the actual framebuffer.

*/
void renderUI(XStuff* xs, GameState* gs) {
	
	if (gs->screen.resized) {
		resizeUI(gs);
	}
	
	glUseProgram(windowProg->id);
	
	glActiveTexture(GL_TEXTURE3);
	glBindTexture(GL_TEXTURE_2D, 0);
	glBindTexture(GL_TEXTURE_2D_ARRAY, icons->tex_id);
	glexit("");
	
	glUniform1i(glGetUniformLocation(windowProg->id, "sTexture"), 3);
	glexit("");
	
	// something odd is going on here with resizing, ui disappears if window is
	// resized larger, but squishes on resize smaller
	renderWindowTmp(gs->screen.wh.x - 50, 10, 2, gs->activeTool == 2 ? .5 : 0);
	renderWindowTmp(gs->screen.wh.x - 50, 60, 0, gs->activeTool == 0 ? .5 : 0);
	renderWindowTmp(gs->screen.wh.x - 50, 110, 1, gs->activeTool == 1 ? .5 : 0);
	
}
Exemple #11
0
void initFBO(Framebuffer* fb, FBOConfig* cfg) {
	int i, dblen = 0;
	GLenum status;
	GLenum DrawBuffers[32]; // nonsense beyond this point...
	
	
	glGenFramebuffers(1, &fb->fb);
	glBindFramebuffer(GL_FRAMEBUFFER, fb->fb);
	glexit("fbo creation");
	
	// The depth buffer
	for(i = 0; cfg[i].texture != 0; i++) {
		GLenum att = cfg[i].attachment;
		
		glFramebufferTexture2D(GL_FRAMEBUFFER, att, GL_TEXTURE_2D, cfg[i].texture, 0);
	
		if(att != GL_DEPTH_ATTACHMENT && att != GL_STENCIL_ATTACHMENT) {
			DrawBuffers[dblen++] = att;
		}
	}
	glexit("fbo texture attach");
	

	glDrawBuffers(dblen, DrawBuffers);
	glexit("fbo drawbuffers");
	
	
	status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
	if(status != GL_FRAMEBUFFER_COMPLETE) {
		printf("fbo status invalid\n");
		exit(1);
	}
	printf("FBO created.\n");
	
	glBindFramebuffer(GL_FRAMEBUFFER, 0);
	glexit("unbind fb");
}
Exemple #12
0
void shadingPass(GameState* gs) {
	
	Matrix world;
	
	world = IDENT_MATRIX;
	
	glUseProgram(shadingProg->id);
	glexit("shading prog");

	glActiveTexture(GL_TEXTURE0 + 6);
	glexit("shading tex 1");
	glBindTexture(GL_TEXTURE_2D, gs->diffuseTexBuffer);
	glexit("shading tex 2");
	glActiveTexture(GL_TEXTURE0 + 7);
	glexit("shading tex 3");
	glBindTexture(GL_TEXTURE_2D, gs->normalTexBuffer);
	glexit("shading tex 4");
	glActiveTexture(GL_TEXTURE0 + 8);
	glexit("shading tex 5");
	glBindTexture(GL_TEXTURE_2D, gs->depthTexBuffer);
	glexit("shading tex 6");
	glActiveTexture(GL_TEXTURE0 + 9);
	glexit("shading tex 5");
	glBindTexture(GL_TEXTURE_2D, gs->selectionTexBuffer);
	glexit("shading tex 6");
	
	glUniform1i(glGetUniformLocation(shadingProg->id, "debugMode"), gs->debugMode);
	glUniform1i(glGetUniformLocation(shadingProg->id, "sDiffuse"), 6);
	glUniform1i(glGetUniformLocation(shadingProg->id, "sNormals"), 7);
	glUniform1i(glGetUniformLocation(shadingProg->id, "sDepth"), 8);
 	glUniform1i(glGetUniformLocation(shadingProg->id, "sSelection"), 9);
	glexit("shading samplers");
	
	glUniformMatrix4fv(glGetUniformLocation(shadingProg->id, "world"), 1, GL_FALSE, world.m);
	glexit("shading world");

	glUniform3fv(glGetUniformLocation(shadingProg->id, "sunNormal"), 1, (float*)&gs->sunNormal);
	
	if(gs->screen.resized) {
		glUniform2fv(glGetUniformLocation(shadingProg->id, "resolution"), 1, (float*)&gs->screen.wh);
	}
	
	drawFSQuad();
	glexit("post quad draw");
}
Exemple #13
0
void renderFrame(XStuff* xs, GameState* gs, InputState* is) {
	
	//mModel = IDENT_MATRIX;
	
	
	 
	gs->sunNormal.x = cos(gs->frameTime * gs->sunSpeed);
	gs->sunNormal.y = sin(gs->frameTime * gs->sunSpeed);
	gs->sunNormal.z = 0.0;
	
	
	//mScale3f(10, 10, 10, &mModel);
	//mRot3f(0, 1, 0, gs->direction, &mModel);
	msPush(&gs->proj);
	msPerspective(60, gs->screen.aspect, nearPlane, farPlane, &gs->proj);

	
	msPush(&gs->view);
	
	

	// order matters! don't mess with this.
	msTrans3f(0, -1, gs->zoom, &gs->view);
	msRot3f(1, 0, 0, F_PI / 6, &gs->view);
	msRot3f(0,1,0, gs->direction, &gs->view);
	msTrans3f(-gs->lookCenter.x, 0, -gs->lookCenter.y, &gs->view);
	
	// y-up to z-up rotation
	msRot3f(1, 0, 0, F_PI_2, &gs->view);
	msScale3f(1, 1, -1, &gs->view);
	
	
	// calculate cursor position
	Vector cursorp;
	Vector eyeCoord;
	Vector worldCoord;
	Matrix p, invp, invv;
	
	// device space (-1:1)
	Vector devCoord;
	devCoord.x = 0.50;
	devCoord.y = 0.50;
	devCoord.z = -1.0;
	
	// eye space
	mInverse(msGetTop(&gs->proj), &invp);
	vMatrixMul(&devCoord, &invp, &eyeCoord);
	vNorm(&eyeCoord, &eyeCoord);
	
	// world space
	mInverse(msGetTop(&gs->view), &invv);
	vMatrixMul(&eyeCoord, &invv, &worldCoord);
	vNorm(&worldCoord, &worldCoord);
	
	
	
	
// 	mFastMul(msGetTop(&gs->view), msGetTop(&gs->proj), &mp);
	
// 	mInverse(&mp, &invmp);
	
	
	
	
// 	vMatrixMul(&devCoord, &invmp, &cursorp);
	
	//printf("(%f, %f, %f)\n", worldCoord.x, worldCoord.y, worldCoord.z);
	
	Vector2 c2;
	
	c2.x = 300; //cursorp.x;
	c2.y = 300; //cursorp.z;
	
	
	
	// draw terrain
// 	drawTerrainBlock(&gs->map, msGetTop(&gs->model), msGetTop(&gs->view), msGetTop(&gs->proj), &gs->cursorPos);
	drawTerrain(&gs->map, msGetTop(&gs->view), msGetTop(&gs->proj), &gs->cursorPos, &gs->screen.wh);
	
	renderMarker(gs, 0,0);

	msPop(&gs->view);
	msPop(&gs->proj);
	
	glUseProgram(textProg->id);
	
	
	
	// text stuff
	textProj = IDENT_MATRIX;
	textModel = IDENT_MATRIX;
	
	mOrtho(0, gs->screen.aspect, 0, 1, -1, 100, &textProj);
	//mScale3f(.5,.5,.5, &textProj);
	
	mScale3f(.06, .06, .06, &textModel);
	
	GLuint tp_ul = glGetUniformLocation(textProg->id, "mProj");
	GLuint tm_ul = glGetUniformLocation(textProg->id, "mModel");
	GLuint ts_ul = glGetUniformLocation(textProg->id, "fontTex");
	
	glUniformMatrix4fv(tp_ul, 1, GL_FALSE, textProj.m);
	glUniformMatrix4fv(tm_ul, 1, GL_FALSE, textModel.m);
	glexit("text matrix uniforms");

	glDisable(GL_CULL_FACE);
	
	glActiveTexture(GL_TEXTURE0);
	glexit("active texture");

	glUniform1i(ts_ul, 0);
	glexit("text sampler uniform");
	glBindTexture(GL_TEXTURE_2D, arial->textureID);
	glexit("bind texture");
	
	
	glBindVertexArray(strRI->vao);
	glexit("text vao bind");
	
	glBindBuffer(GL_ARRAY_BUFFER, strRI->vbo);
	glexit("text vbo bind");
	glDrawArrays(GL_TRIANGLES, 0, strRI->vertexCnt);
	glexit("text drawing");
	
}
Exemple #14
0
void initGame(XStuff* xs, GameState* gs) {
	int ww, wh;
	
	glerr("left over error on game init");
	
	
	gs->activeTool = 0;
	
	gs->debugMode = 0;
	gs->sunSpeed = 0;
	
	
	ww = xs->winAttr.width;
	wh = xs->winAttr.height;
	
	gs->screen.wh.x = (float)ww;
	gs->screen.wh.y = (float)wh;
	
	gs->screen.aspect = gs->screen.wh.x / gs->screen.wh.y;
	gs->screen.resized = 0;
	
	
	printf("w: %d, h: %d\n", ww, wh);
	
	glEnable(GL_DEPTH_TEST);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	
	glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
	
	initTexBuffers(gs, 0);

	glBindTexture(GL_TEXTURE_2D, 0);
	
	glGenFramebuffers(1, &gs->framebuffer);
	glBindFramebuffer(GL_FRAMEBUFFER, gs->framebuffer);
	glexit("fbo creation");
	
	// The depth buffer
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gs->diffuseTexBuffer, 0);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, gs->normalTexBuffer, 0);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, gs->selectionTexBuffer, 0);
 	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, gs->depthTexBuffer, 0);
	glexit("fb tex2d");
	
//glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, GL_TEXTURE_2D, gs->depthTexBuffer, 0);
	
	GLenum DrawBuffers[] = {
		GL_COLOR_ATTACHMENT0,
		GL_COLOR_ATTACHMENT1,
		GL_COLOR_ATTACHMENT2
	};
	glDrawBuffers(3, DrawBuffers);
	glexit("drawbuffers");
	
	GLenum status;
	status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
	if(status != GL_FRAMEBUFFER_COMPLETE) {
		printf("fbo status invalid\n");
		exit(1);
	}
	printf("FBO created.\n");
	

	shadingProg = loadCombinedProgram("shading");
	initFSQuad();
	
	// check some prerequisites
// 	GLint MaxDrawBuffers = 0;
// 	glGetIntegerv(GL_MAX_DRAW_BUFFERS, &MaxDrawBuffers);
// 	printf("MAX_DRAW_BUFFERS: %d\n", MaxDrawBuffers);
//  	if(MaxDrawBuffers < 4) {
// 		fprintf(stderr, "FATAL: GL_MAX_DRAW_BUFFERS is too low: %d. Minimum required value is 4.\n", MaxDrawBuffers);
// 		exit(3);
// 	};

	getPrintGLEnum(GL_MAX_COLOR_ATTACHMENTS, "meh");
	getPrintGLEnum(GL_MAX_DRAW_BUFFERS, "meh");
	getPrintGLEnum(GL_MAX_FRAMEBUFFER_WIDTH, "meh");
	getPrintGLEnum(GL_MAX_FRAMEBUFFER_HEIGHT, "meh");
	getPrintGLEnum(GL_MAX_FRAMEBUFFER_LAYERS, "meh");
	getPrintGLEnum(GL_MAX_FRAMEBUFFER_SAMPLES, "meh");
	getPrintGLEnum(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, "meh");
	getPrintGLEnum(GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS, "meh");
	getPrintGLEnum(GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS, "meh");
	getPrintGLEnum(GL_MAX_TEXTURE_IMAGE_UNITS, "meh");
	getPrintGLEnum(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, "meh");
	getPrintGLEnum(GL_MAX_ARRAY_TEXTURE_LAYERS, "meh");
	getPrintGLEnum(GL_MAX_SAMPLES, "meh");
	
	
	// set up matrix stacks
	MatrixStack* view, *proj;
	
	view = &gs->view;
	proj = &gs->proj;
	
	msAlloc(2, view);
	msAlloc(2, proj);

	msIdent(view);
	msIdent(proj);
	

	
	
	// perspective matrix, pretty standard
// 	msPerspective(60, 1.0, 01000.0f, 100000.0f, proj);
// 		msOrtho(0, 1, 0, 1, .01, 100000, proj);

	gs->zoom = -760.0;
	gs->direction = 0.0f;
	gs->lookCenter.x = 128;
	gs->lookCenter.y = 128;
	
	
	// initialize all those magic globals
	initMap(&gs->map);
	
	initUI(gs);
	initMarker();
	
	// text rendering stuff
	arial = LoadFont("Arial", 64, NULL);
	glerr("clearing before text program load");
	textProg = loadCombinedProgram("text");
	
	unsigned int colors[] = {
		0xFF0000FF, 2,
		0x00FF00FF, 4,
		0x0000FFFF, INT_MAX
	};
	
	strRI = prepareText(arial, "FPS: --", -1, colors);
	/*
	OBJContents cube;
	loadOBJFile("assets/models/untitled.obj", 0, &cube);
	Mesh* cubem = OBJtoMesh(&cube);
	*/
	
}