void TinyGLRenderer::drawTexturedRect3D(const Math::Vector3d &topLeft, const Math::Vector3d &bottomLeft, const Math::Vector3d &topRight, const Math::Vector3d &bottomRight, Texture *texture) { TinyGLTexture *glTexture = static_cast<TinyGLTexture *>(texture); const float w = glTexture->width / (float)glTexture->internalWidth; const float h = glTexture->height / (float)glTexture->internalHeight; tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE_MINUS_SRC_ALPHA); tglEnable(TGL_BLEND); tglDepthMask(TGL_FALSE); tglBindTexture(TGL_TEXTURE_2D, glTexture->id); tglBegin(TGL_TRIANGLE_STRIP); tglTexCoord2f(0, 0); tglVertex3f(-topLeft.x(), topLeft.y(), topLeft.z()); tglTexCoord2f(0, h); tglVertex3f(-bottomLeft.x(), bottomLeft.y(), bottomLeft.z()); tglTexCoord2f(w, 0); tglVertex3f(-topRight.x(), topRight.y(), topRight.z()); tglTexCoord2f(w, h); tglVertex3f(-bottomRight.x(), bottomRight.y(), bottomRight.z()); tglEnd(); tglDisable(TGL_BLEND); tglDepthMask(TGL_TRUE); }
void TinyGLRenderer::drawTexturedRect2D(const Common::Rect &screenRect, const Common::Rect &textureRect, Texture *texture, float transparency, bool additiveBlending) { const float sLeft = screenRect.left; const float sTop = screenRect.top; const float sWidth = screenRect.width(); const float sHeight = screenRect.height(); if (transparency >= 0.0) { if (additiveBlending) { tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE); } else { tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE_MINUS_SRC_ALPHA); } tglEnable(TGL_BLEND); } else { transparency = 1.0; } tglEnable(TGL_TEXTURE_2D); tglDepthMask(TGL_FALSE); Graphics::BlitTransform transform(sLeft, sTop); transform.sourceRectangle(textureRect.left, textureRect.top, sWidth, sHeight); transform.tint(transparency); tglBlit(((TinyGLTexture *)texture)->getBlitTexture(), transform); tglDisable(TGL_BLEND); tglDepthMask(TGL_TRUE); }
void GfxTinyGL::setShadow(Shadow *shadow) { _currentShadowArray = shadow; if (shadow) tglDisable(TGL_LIGHTING); else tglEnable(TGL_LIGHTING); }
void TinyGLRenderer::drawRect2D(const Common::Rect &rect, uint32 color) { uint8 a, r, g, b; Graphics::colorToARGB< Graphics::ColorMasks<8888> >(color, a, r, g, b); tglDisable(TGL_TEXTURE_2D); tglColor4f(r / 255.0, g / 255.0, b / 255.0, a / 255.0); if (a != 255) { tglEnable(TGL_BLEND); tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE_MINUS_SRC_ALPHA); } for (int x = rect.left; x < rect.right; x++) { for (int y = rect.top; y < rect.bottom; y++) { _fb->writePixel(y * kOriginalWidth + x, a, r, g, b); } } tglDisable(TGL_BLEND); }
void TinyGLRenderer::drawRect2D(const Common::Rect &rect, uint32 color) { uint8 a, r, g, b; Graphics::colorToARGB< Graphics::ColorMasks<8888> >(color, a, r, g, b); tglDisable(TGL_TEXTURE_2D); tglColor4f(r / 255.0, g / 255.0, b / 255.0, a / 255.0); if (a != 255) { tglEnable(TGL_BLEND); tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE_MINUS_SRC_ALPHA); } tglBegin(TGL_TRIANGLE_STRIP); tglVertex3f(rect.left, rect.bottom, 0.0f); tglVertex3f(rect.right, rect.bottom, 0.0f); tglVertex3f(rect.left, rect.top, 0.0f); tglVertex3f(rect.right, rect.top, 0.0f); tglEnd(); tglDisable(TGL_BLEND); }
void TinyGLRenderer::draw2DText(const Common::String &text, const Common::Point &position) { TinyGLTexture *glFont = static_cast<TinyGLTexture *>(_font); // The font only has uppercase letters Common::String textToDraw = text; textToDraw.toUppercase(); tglEnable(TGL_BLEND); tglBlendFunc(TGL_SRC_ALPHA, TGL_ONE_MINUS_SRC_ALPHA); tglEnable(TGL_TEXTURE_2D); tglDepthMask(TGL_FALSE); tglColor3f(1.0f, 1.0f, 1.0f); tglBindTexture(TGL_TEXTURE_2D, glFont->id); int x = position.x; int y = position.y; for (uint i = 0; i < textToDraw.size(); i++) { Common::Rect textureRect = getFontCharacterRect(textToDraw[i]); int w = textureRect.width(); int h = textureRect.height(); Graphics::BlitTransform transform(x, y); transform.sourceRectangle(textureRect.left, textureRect.top, w, h); transform.flip(true, false); Graphics::tglBlit(glFont->getBlitTexture(), transform); x += textureRect.width() - 3; } tglDisable(TGL_TEXTURE_2D); tglDisable(TGL_BLEND); tglDepthMask(TGL_TRUE); }
void GfxTinyGL::setupLight(Light *light, int lightId) { assert(lightId < T_MAX_LIGHTS); tglEnable(TGL_LIGHTING); float lightColor[] = { 0.0f, 0.0f, 0.0f, 1.0f }; float lightPos[] = { 0.0f, 0.0f, 0.0f, 1.0f }; float lightDir[] = { 0.0f, 0.0f, -1.0f }; float cutoff = 180.0f; float intensity = light->_intensity / 1.3f; lightColor[0] = ((float)light->_color.getRed() / 15.0f) * intensity; lightColor[1] = ((float)light->_color.getGreen() / 15.0f) * intensity; lightColor[2] = ((float)light->_color.getBlue() / 15.0f) * intensity; if (light->_type == "omni") { lightPos[0] = light->_pos.x(); lightPos[1] = light->_pos.y(); lightPos[2] = light->_pos.z(); } else if (light->_type == "direct") { lightPos[0] = -light->_dir.x(); lightPos[1] = -light->_dir.y(); lightPos[2] = -light->_dir.z(); lightPos[3] = 0; } else if (light->_type == "spot") { lightPos[0] = light->_pos.x(); lightPos[1] = light->_pos.y(); lightPos[2] = light->_pos.z(); lightDir[0] = light->_dir.x(); lightDir[1] = light->_dir.y(); lightDir[2] = light->_dir.z(); /* FIXME: TGL_SPOT_CUTOFF should be light->_penumbraangle, but there seems to be a bug in tinygl as it renders differently from OpenGL. Reproducing: turn off all lights (comment out), go to scene "al", and walk along left wall under the lamp. */ cutoff = 90.0f; } else { error("Scene::setupLights() Unknown type of light: %s", light->_type.c_str()); return; } tglDisable(TGL_LIGHT0 + lightId); tglLightfv(TGL_LIGHT0 + lightId, TGL_DIFFUSE, lightColor); tglLightfv(TGL_LIGHT0 + lightId, TGL_POSITION, lightPos); tglLightfv(TGL_LIGHT0 + lightId, TGL_SPOT_DIRECTION, lightDir); tglLightf(TGL_LIGHT0 + lightId, TGL_SPOT_CUTOFF, cutoff); tglEnable(TGL_LIGHT0 + lightId); }
void TinyGLRenderer::init(Graphics::PixelBuffer &screenBuffer) { debug("Initializing Software 3D Renderer"); _nonPowerOfTwoTexSupport = true; _fb = new TinyGL::FrameBuffer(kOriginalWidth, kOriginalHeight, screenBuffer); TinyGL::glInit(_fb, 512); tglMatrixMode(TGL_PROJECTION); tglLoadIdentity(); tglMatrixMode(TGL_MODELVIEW); tglLoadIdentity(); tglDisable(TGL_LIGHTING); tglEnable(TGL_TEXTURE_2D); tglEnable(TGL_DEPTH_TEST); }
void TinyGLRenderer::init() { debug("Initializing Software 3D Renderer"); computeScreenViewport(); Graphics::PixelBuffer screenBuffer = _system->getScreenPixelBuffer(); _fb = new TinyGL::FrameBuffer(kOriginalWidth, kOriginalHeight, screenBuffer); TinyGL::glInit(_fb, 512); tglMatrixMode(TGL_PROJECTION); tglLoadIdentity(); tglMatrixMode(TGL_MODELVIEW); tglLoadIdentity(); tglDisable(TGL_LIGHTING); tglEnable(TGL_TEXTURE_2D); tglEnable(TGL_DEPTH_TEST); }
void GfxTinyGL::drawShadowPlanes() { tglEnable(TGL_SHADOW_MASK_MODE); if (!_currentShadowArray->shadowMask) { _currentShadowArray->shadowMask = new byte[_screenWidth * _screenHeight]; _currentShadowArray->shadowMaskSize = _screenWidth * _screenHeight; } memset(_currentShadowArray->shadowMask, 0, _screenWidth * _screenHeight); tglSetShadowMaskBuf(_currentShadowArray->shadowMask); _currentShadowArray->planeList.begin(); for (SectorListType::iterator i = _currentShadowArray->planeList.begin(); i != _currentShadowArray->planeList.end(); ++i) { Sector *shadowSector = i->sector; tglBegin(TGL_POLYGON); for (int k = 0; k < shadowSector->getNumVertices(); k++) { tglVertex3f(shadowSector->getVertices()[k].x(), shadowSector->getVertices()[k].y(), shadowSector->getVertices()[k].z()); } tglEnd(); } tglSetShadowMaskBuf(NULL); tglDisable(TGL_SHADOW_MASK_MODE); }
void GfxTinyGL::drawSprite(const Sprite *sprite) { tglMatrixMode(TGL_TEXTURE); tglLoadIdentity(); tglMatrixMode(TGL_MODELVIEW); tglPushMatrix(); tglTranslatef(sprite->_pos.x(), sprite->_pos.y(), sprite->_pos.z()); TGLfloat modelview[16]; tglGetFloatv(TGL_MODELVIEW_MATRIX, modelview); // We want screen-aligned sprites so reset the rotation part of the matrix. for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) { modelview[i * 4 + j] = 1.0f; } else { modelview[i * 4 + j] = 0.0f; } } } tglLoadMatrixf(modelview); tglDisable(TGL_LIGHTING); tglBegin(TGL_POLYGON); tglTexCoord2f(0.0f, 0.0f); tglVertex3f(sprite->_width / 2, sprite->_height, 0.0f); tglTexCoord2f(0.0f, 1.0f); tglVertex3f(sprite->_width / 2, 0.0f, 0.0f); tglTexCoord2f(1.0f, 1.0f); tglVertex3f(-sprite->_width / 2, 0.0f, 0.0f); tglTexCoord2f(1.0f, 0.0f); tglVertex3f(-sprite->_width / 2, sprite->_height, 0.0f); tglEnd(); tglEnable(TGL_LIGHTING); tglPopMatrix(); }
void GfxTinyGL::finishActorDraw() { tglMatrixMode(TGL_MODELVIEW); tglPopMatrix(); tglDisable(TGL_TEXTURE_2D); if (_currentShadowArray) { tglSetShadowMaskBuf(NULL); }/* else { uint16 *dst = (uint16 *)_zb->pbuf; uint16 c = 0xffff; for (int x = g_winX1; x <= g_winX2; x++) { WRITE_LE_UINT16(dst + 640 * g_winY1 + x, c); } for (int x = g_winX1; x <= g_winX2; x++) { WRITE_LE_UINT16(dst + 640 * g_winY2 + x, c); } for (int y = g_winY1; y <= g_winY2; y++) { WRITE_LE_UINT16(dst + 640 * y + g_winX1, c); } for (int y = g_winY1; y <= g_winY2; y++) { WRITE_LE_UINT16(dst + 640 * y + g_winX2, c); } }*/ }
void GfxTinyGL::disableLights() { tglDisable(TGL_LIGHTING); }
void GfxTinyGL::clearShadowMode() { tglDisable(TGL_SHADOW_MODE); }