コード例 #1
0
ファイル: gedraw2d.c プロジェクト: drewet/libge
void geFillRectScreenDepth(int x, int y, int z, int width, int height, u32 color){
	if(abs(z) > 2048){
		return;
	}
	x += libge_context->draw_off_x;
	y += libge_context->draw_off_y;
	
	glBindTexture(GL_TEXTURE_2D, 0);
	glDisable(GL_TEXTURE_2D);
	if(!ge_current_shader){
		geShaderUse(_ge_GetVideoContext()->shader2d);
	}
	if(ge_current_shader == _ge_GetVideoContext()->shader2d){
		geShaderUniform1f(_ge_GetVideoContext()->loc_textured, 0.0);
	}

	glBegin(GL_QUADS);
		glColor4ub(R(color), G(color), B(color), A(color));
		glTexCoord3f(-1.0, -1.0, -1.0);
		glVertex3f(x, y, z+libge_context->img_stack[z+2048]);
		glVertex3f(x+width, y, z+libge_context->img_stack[z+2048]);
		glVertex3f(x+width, y+height, z+libge_context->img_stack[z+2048]);
		glVertex3f(x, y+height, z+libge_context->img_stack[z+2048]);
	glEnd();

	libge_context->img_stack[z+2048] += 0.001;
	glEnable(GL_TEXTURE_2D);
}
コード例 #2
0
ファイル: gedraw2d.c プロジェクト: drewet/libge
void geDrawLineScreenFadeDepth(int x0, int y0, int z0, int x1, int y1, int z1, u32 color0, u32 color1){
	if(abs(z0) > 2048 || abs(z1) > 2048){
		return;
	}
	x0 += libge_context->draw_off_x;
	x1 += libge_context->draw_off_x;
	y0 += libge_context->draw_off_y;
	y1 += libge_context->draw_off_y;

	glBindTexture(GL_TEXTURE_2D, 0);
	glDisable(GL_TEXTURE_2D);
	if(!ge_current_shader){
		geShaderUse(_ge_GetVideoContext()->shader2d);
	}
	if(ge_current_shader == _ge_GetVideoContext()->shader2d){
		geShaderUniform1f(_ge_GetVideoContext()->loc_textured, 0.0);
	}

	glBegin(GL_LINES);
		glColor4ub(R(color0), G(color0), B(color0), A(color0));
		glTexCoord3f(-1.0, -1.0, -1.0);
		glVertex3f(x0, y0, z0+libge_context->img_stack[z0+2048]);
		glColor4ub(R(color1), G(color1), B(color1), A(color1));
		glVertex3f(x1, y1, z1+libge_context->img_stack[z1+2048]);
	glEnd();

	libge_context->img_stack[z0+2048] += 0.001;
	libge_context->img_stack[z1+2048] += 0.001;
	glEnable(GL_TEXTURE_2D);
}
コード例 #3
0
ファイル: ge_context.c プロジェクト: lmorel3/libge
int geDrawingMode(int mode){
	int last = libge_context->drawing_mode;
	if(mode != libge_context->drawing_mode || mode & 0xF0000000){
		if(mode & GE_DRAWING_MODE_2D){
			glActiveTexture(GL_TEXTURE0);
			glEnable(GL_TEXTURE_2D);
			glDisable(GL_CULL_FACE);
		
			glEnable(GL_ALPHA_TEST);
			glEnable(GL_BLEND);
			glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

			geMatrixMode(GE_MATRIX_PROJECTION);
			geLoadIdentity();
			geOrthogonal(0.0, libge_context->width, libge_context->height, 0.0, -2049.0, 2049.0);
			geMatrixMode(GE_MATRIX_VIEW);
			geLoadIdentity();
			geMatrixMode(GE_MATRIX_MODEL);
			geLoadIdentity();
			geMatrixMode(GE_MATRIX_MODELVIEW);
			geLoadIdentity();
			geMatrixMode(GE_MATRIX_TEXTURE0);
			geLoadIdentity();
			geUpdateMatrix();

			if(mode & GE_DRAWING_2D_DEPTH){
				glEnable(GL_DEPTH_TEST);
				geClearMode(GE_CLEAR_COLOR_BUFFER | GE_CLEAR_DEPTH_BUFFER);
			}else{
				glDisable(GL_DEPTH_TEST);
				geClearMode(GE_CLEAR_COLOR_BUFFER);
			}
		
			geShaderUse(_ge_GetVideoContext()->shader2d);
			glActiveTexture(GL_TEXTURE0);
		}
		if(mode & GE_DRAWING_MODE_3D){
			glEnable(GL_CULL_FACE);
			glFrontFace(GL_CW);
			glEnable(GL_DEPTH_TEST);
			geClearMode(GE_CLEAR_COLOR_BUFFER | GE_CLEAR_DEPTH_BUFFER);

			geMatrixMode(GE_MATRIX_PROJECTION);
			geLoadIdentity();
			if(libge_context->projection_matrix[0] == (float)0xFFFFFFFF){
				gePerspective(60.0, (float)libge_context->width / (float)libge_context->height, 0.1, 100000.0);
			}else{
				geLoadMatrix(libge_context->projection_matrix);
			}
		}
	}
	libge_context->drawing_mode = mode;
	return last;
}
コード例 #4
0
ファイル: geshader.c プロジェクト: drewet/libge
ge_Shader* geShaderUse(ge_Shader* shader){
	if(!libge_context->shaders_available || glUseProgram == 0)return 0;
	ge_Shader* ret = ge_current_shader;
	if(ge_force_shader){
		shader = ge_force_shader;
	}
	ge_current_shader = shader;
	if(!shader){
		glUseProgram(0);
		if(libge_context->drawing_mode & GE_DRAWING_MODE_2D){
			geShaderUse(_ge_GetVideoContext()->shader2d);
		}
	}else{
		glUseProgram(shader->programId);
		geMatrixLocations();
//		ge_draw_object_set_shader(shader);
	}
	return ret;
}
コード例 #5
0
ファイル: gedraw2d.c プロジェクト: drewet/libge
void geRenderFontOutline(int x, int y, ge_Font* font, u32 color, u32 outlineColor, const char* text, int len){
	int i;
	int b_x = x;
	y += font->size;
	int z = 0;
	
	glEnable(GL_ALPHA_TEST);
	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, font->texture->id);
	if(!ge_current_shader){
		geShaderUse(_ge_GetVideoContext()->shader2d);
	}
	if(ge_current_shader == _ge_GetVideoContext()->shader2d){
		geShaderUniform1f(_ge_GetVideoContext()->loc_textured, 1.0);
	}

	glBegin(GL_QUADS);

	float rx = font->texture->u / font->texture->width;
	float ry = font->texture->v / font->texture->height;
		
	for(i=0; i<len; i++){
		if(text[i] == '\n'){
			x = b_x;
			y += font->size;
			continue;
		}

		float sx = ((float)font->positions[(u8)text[i]].x) * rx;
		float sy = ((float)font->positions[(u8)text[i]].y) * ry;
		float texMaxX = ((float)font->positions[(u8)text[i]].w) * rx;
		float texMaxY = ((float)font->positions[(u8)text[i]].h) * ry;
		float width = font->positions[(u8)text[i]].w;
		float height = font->positions[(u8)text[i]].h;
		float fy = (float)y - font->positions[(u8)text[i]].posY;

		if(A(outlineColor) != 0){
			float ofs = 0.06;
			float scale = 1.1;

			glColor4ub(R(outlineColor), G(outlineColor), B(outlineColor), A(outlineColor));
			glTexCoord2f(sx, sy);
			glVertex3f(x-width*ofs, fy-font->positions[(u8)text[i]].posY*ofs, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx+texMaxX, sy);
			glVertex3f(x+width*scale, fy-font->positions[(u8)text[i]].posY*ofs, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx+texMaxX, sy+texMaxY);
			glVertex3f(x+width*scale, fy+height*scale, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx, sy+texMaxY);
			glVertex3f(x-width*ofs, fy+height*scale, z+libge_context->img_stack[z+2048]);
		}
		
		glColor4ub(R(color), G(color), B(color), A(color));

		glTexCoord2f(sx, sy);
		glVertex3f(x, fy, z+libge_context->img_stack[z+2048]);

		glTexCoord2f(sx+texMaxX, sy);
		glVertex3f(x+width, fy, z+libge_context->img_stack[z+2048]);

		glTexCoord2f(sx+texMaxX, sy+texMaxY);
		glVertex3f(x+width, fy+height, z+libge_context->img_stack[z+2048]);

		glTexCoord2f(sx, sy+texMaxY);
		glVertex3f(x, fy+height, z+libge_context->img_stack[z+2048]);

		x += font->positions[(u8)text[i]].advX;
	}
	glEnd();

	libge_context->img_stack[z+2048] += 0.001;
}
コード例 #6
0
ファイル: gedraw2d.c プロジェクト: drewet/libge
void geBlitImageDepthStretchedRotated(int x, int y, int z, ge_Image* img, int _sx, int _sy, int ex, int ey, int width, int height, float angle, int flags){
	if(!img)return;
	if((t_ptr)img==0xBAADF00D)return;
	if(!img->id)return;
	if(abs(z) > 2048){
		return;
	}
	if(!(flags & GE_BLIT_NOOFFSET)){
		x += libge_context->draw_off_x;
		y += libge_context->draw_off_y;
	}

	if(flags & GE_BLIT_NOALPHA){
		glDisable(GL_ALPHA_TEST);
		glDisable(GL_BLEND);
	}else{
		glEnable(GL_ALPHA_TEST);
		glEnable(GL_BLEND);
		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
	}

	float texMaxX = img->u;
	float texMaxY = img->v;
	float sx = _sx*texMaxX/img->width;
	float sy = _sy*texMaxY/img->height;
	texMaxX = ex*texMaxX/img->width;
	texMaxY = ey*texMaxY/img->height;

	if(img->flags & GE_IMAGE_ANIMATED){
		sy += ((_ge_ImageAnimated*)img)->_ge_n * img->v;
		if(geGetTickFloat() - ((_ge_ImageAnimated*)img)->_ge_t >= ((_ge_ImageAnimated*)img)->frameTime){
			((_ge_ImageAnimated*)img)->_ge_t = geGetTickFloat();
			((_ge_ImageAnimated*)img)->_ge_n = (((_ge_ImageAnimated*)img)->_ge_n + 1) % ((_ge_ImageAnimated*)img)->nImages;
		}
	}

	float Cos = geCos(angle);
	float Sin = geSin(-angle);

	float sw = Sin*width*0.5;
	float sh = Sin*height*0.5;
	float cw = Cos*width*0.5;
	float ch = Cos*height*0.5;

	int mw = 0;
	int mh = 0;
	if(!(flags & GE_BLIT_CENTERED)){
		mw = (width-x) / 2;
		mh = (height-y) / 2;
		mw += (int)((x - cw - sh) - (x - cw + sh));
		mh += (int)((y - sw + ch) - (y - sw - ch));
	}
	x += mw;
	y += mh;
	
	if(!ge_current_shader){
		geShaderUse(_ge_GetVideoContext()->shader2d);
	}
	if(ge_current_shader == _ge_GetVideoContext()->shader2d){
		geShaderUniform1f(_ge_GetVideoContext()->loc_textured, 1.0);
		glUniform1f(_ge_GetVideoContext()->shader2d->loc_time, ((float)geGetTick()) / 1000.0);
		glUniform1f(_ge_GetVideoContext()->shader2d->loc_ratio, ((float)libge_context->width) / ((float)libge_context->height));
	}
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, img->id);

	glBegin(GL_TRIANGLE_FAN);
		glColor4ub(R(img->color), G(img->color), B(img->color), A(img->color));
		glTexCoord2f(sx, sy+texMaxY);		 glVertex3f(x - cw - sh, y - sw + ch, (float)z+libge_context->img_stack[z+2048]);
		glTexCoord2f(sx, sy);				 glVertex3f(x - cw + sh, y - sw - ch, (float)z+libge_context->img_stack[z+2048]);
		glTexCoord2f(sx+texMaxX, sy);		 glVertex3f(x + cw + sh, y + sw - ch, (float)z+libge_context->img_stack[z+2048]);
		glTexCoord2f(sx+texMaxX, sy+texMaxY);glVertex3f(x + cw - sh, y + sw + ch, (float)z+libge_context->img_stack[z+2048]);
	glEnd();
	
	libge_context->img_stack[z+2048] += 0.001;
}
コード例 #7
0
ファイル: gedraw2d.c プロジェクト: drewet/libge
void geBlitImageDepthStretched(int x, int y, int z, ge_Image* img, int _sx, int _sy, int ex, int ey, int width, int height, int flags){
	if(!img)return;
	if((t_ptr)img==0xBAADF00D)return;
	if(!img->id)return;
	if(abs(z) > 2048){
		return;
	}
	x += libge_context->draw_off_x;
	y += libge_context->draw_off_y;

	if(flags & GE_BLIT_CENTERED){
		x -= width / 2;
		y -= height / 2;
	}
	
	if(x > libge_context->width || x+width < 0 || y > libge_context->height || y+height < 0){
		return;
	}

	if(flags & GE_BLIT_NOALPHA){
		glDisable(GL_ALPHA_TEST);
		glDisable(GL_BLEND);
	}else{
		glEnable(GL_ALPHA_TEST);
		glEnable(GL_BLEND);
		int b_src = libge_context->blend_src;
		int b_dst = libge_context->blend_dst;
		b_src = (b_src == GE_DEFAULT) ? GL_SRC_ALPHA : b_src;
		b_dst = (b_dst == GE_DEFAULT) ? GL_ONE_MINUS_SRC_ALPHA : b_dst;
		glBlendFunc(b_src, b_dst);
	}

	float texMaxX = img->u;
	float texMaxY = img->v;
	float sx = _sx*texMaxX/img->width;
	float sy = _sy*texMaxY/img->height;
	texMaxX = ex*texMaxX/img->width;
	texMaxY = ey*texMaxY/img->height;

	if(img->flags & GE_IMAGE_ANIMATED){
		sy += ((_ge_ImageAnimated*)img)->_ge_n * img->v;
		if(geGetTickFloat() - ((_ge_ImageAnimated*)img)->_ge_t >= ((_ge_ImageAnimated*)img)->frameTime){
			((_ge_ImageAnimated*)img)->_ge_t = geGetTickFloat();
			((_ge_ImageAnimated*)img)->_ge_n = (((_ge_ImageAnimated*)img)->_ge_n + 1) % ((_ge_ImageAnimated*)img)->nImages;
		}
	}

	int tex_mode = GL_TEXTURE_2D;
	
	if(!ge_current_shader){
		geShaderUse(_ge_GetVideoContext()->shader2d);
	}
	if(ge_current_shader == _ge_GetVideoContext()->shader2d){
		geShaderUniform1f(_ge_GetVideoContext()->loc_textured, 1.0);
		glUniform1f(ge_current_shader->loc_time, ((float)geGetTick()) / 1000.0);
		glUniform1f(ge_current_shader->loc_ratio, ((float)libge_context->width) / ((float)libge_context->height));
	}
	
	glEnable(tex_mode);
	glBindTexture(tex_mode, img->id);
	
	if(flags & GE_BLIT_VFLIP){
		glBegin(GL_QUADS);
			glColor4ub(R(img->color), G(img->color), B(img->color), A(img->color));
	
			glTexCoord2f(sx, sy+texMaxY);
			glVertex3f(x, y, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx+texMaxX, sy+texMaxY);
			glVertex3f(x+width, y, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx+texMaxX, sy);
			glVertex3f(x+width, y+height, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx, sy);
			glVertex3f(x, y+height, z+libge_context->img_stack[z+2048]);
		glEnd();
	}else{
		glBegin(GL_QUADS);
			glColor4ub(R(img->color), G(img->color), B(img->color), A(img->color));
	
			glTexCoord2f(sx, sy);
			glVertex3f(x, y, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx+texMaxX, sy);
			glVertex3f(x+width, y, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx+texMaxX, sy+texMaxY);
			glVertex3f(x+width, y+height, z+libge_context->img_stack[z+2048]);

			glTexCoord2f(sx, sy+texMaxY);
			glVertex3f(x, y+height, z+libge_context->img_stack[z+2048]);
		glEnd();
	}

	libge_context->img_stack[z+2048] += 0.001;
}