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); }
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); }
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; }
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; }
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; }
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; }
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; }