From 0948dc611a9dbed8d93663f6364df529f9ee662c Mon Sep 17 00:00:00 2001 From: "wagic.the.homebrew@gmail.com" Date: Thu, 21 Jan 2010 11:37:31 +0000 Subject: [PATCH] Erwan - Merge some linux and Windows code in JGE to improve maintenance --- JGE/JGE.vcproj | 12 +- JGE/Makefile | 2 +- JGE/src/linux/JSfx.cpp | 204 -- JGE/src/{linux => pc}/JGfx.cpp | 10 +- .../{win/JSoundSystem_Win.cpp => pc/JSfx.cpp} | 0 .../{win/JSocket_Win.cpp => pc/JSocket.cpp} | 0 JGE/src/win/JRenderer_Win.cpp | 1746 ----------------- 7 files changed, 16 insertions(+), 1958 deletions(-) delete mode 100644 JGE/src/linux/JSfx.cpp rename JGE/src/{linux => pc}/JGfx.cpp (99%) rename JGE/src/{win/JSoundSystem_Win.cpp => pc/JSfx.cpp} (100%) rename JGE/src/{win/JSocket_Win.cpp => pc/JSocket.cpp} (100%) delete mode 100644 JGE/src/win/JRenderer_Win.cpp diff --git a/JGE/JGE.vcproj b/JGE/JGE.vcproj index aeb624ce5..da2b024de 100644 --- a/JGE/JGE.vcproj +++ b/JGE/JGE.vcproj @@ -468,6 +468,10 @@ /> + + @@ -570,20 +574,16 @@ RelativePath=".\src\JParticleSystem.cpp" > - - -// -//------------------------------------------------------------------------------------- - -#include -#include "../../Dependencies/include/fmod.h" - -#include "../../include/JSoundSystem.h" -#include "../../include/JFileSystem.h" - - -////////////////////////////////////////////////////////////////////////// -JMusic::JMusic() -{ - -} - -JMusic::~JMusic() -{ - JSoundSystem::GetInstance()->StopMusic(this); - //JSoundSystem::GetInstance()->FreeMusic(this); - - if (mTrack) - FSOUND_Sample_Free(mTrack); -} - - -////////////////////////////////////////////////////////////////////////// -JSample::JSample() -{ - -} - -JSample::~JSample() -{ - //JSoundSystem::GetInstance()->FreeSample(this); - if (mSample) - FSOUND_Sample_Free(mSample); -} - - -////////////////////////////////////////////////////////////////////////// -JSoundSystem* JSoundSystem::mInstance = NULL; - - -JSoundSystem* JSoundSystem::GetInstance() -{ - if (mInstance == NULL) - { - mInstance = new JSoundSystem(); - mInstance->InitSoundSystem(); - } - - return mInstance; -} - - -void JSoundSystem::Destroy() -{ - if (mInstance) - { - mInstance->DestroySoundSystem(); - delete mInstance; - mInstance = NULL; - } -} - - -JSoundSystem::JSoundSystem() -{ - mVolume = 0; - mSampleVolume = 0; - mChannel = FSOUND_FREE; -} - - -JSoundSystem::~JSoundSystem() -{ - -} - - -void JSoundSystem::InitSoundSystem() -{ - FSOUND_Init(44100, 32, 0); -} - - -void JSoundSystem::DestroySoundSystem() -{ - FSOUND_Close(); - -} - - -JMusic *JSoundSystem::LoadMusic(const char *fileName) -{ - JMusic* music = new JMusic(); - if (music) - { - JFileSystem* fileSystem = JFileSystem::GetInstance(); - if (fileSystem->OpenFile(fileName)) - { - - int size = fileSystem->GetFileSize(); - char *buffer = new char[size]; - fileSystem->ReadFile(buffer, size); - music->mTrack = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, FSOUND_LOADMEMORY, 0, size); - - delete[] buffer; - fileSystem->CloseFile(); - } - - } - - return music; -} - -void JSoundSystem::PlayMusic(JMusic *music, bool looping) -{ - - - if (music && music->mTrack) - { - mChannel = FSOUND_PlaySound(mChannel, music->mTrack); - SetMusicVolume(mVolume); - - if (looping) - FSOUND_SetLoopMode(mChannel, FSOUND_LOOP_NORMAL); - else - FSOUND_SetLoopMode(mChannel, FSOUND_LOOP_OFF); - - } -} - - -void JSoundSystem::StopMusic(JMusic *music __attribute__((unused))) -{ - // if (music && music->mTrack) - // FMUSIC_StopSong(music->mTrack); - - FSOUND_StopSound(mChannel); -} - - -void JSoundSystem::SetVolume(int volume){ - SetMusicVolume(volume); - SetSfxVolume(volume); -} - -void JSoundSystem::SetMusicVolume(int volume) -{ - if (mChannel != FSOUND_FREE) FSOUND_SetVolumeAbsolute(mChannel,volume * 2.55); - mVolume = volume; -} - -void JSoundSystem::SetSfxVolume(int volume){ - //this sets the volume to all channels then reverts back the volume for music.. - //that's a bit dirty but it works - FSOUND_SetVolumeAbsolute(FSOUND_ALL,volume * 2.55); - mSampleVolume = volume; - SetMusicVolume(mVolume); -} - - -JSample *JSoundSystem::LoadSample(const char *fileName) -{ - JSample* sample = new JSample(); - if (sample) - { - JFileSystem* fileSystem = JFileSystem::GetInstance(); - if (fileSystem->OpenFile(fileName)) - { - int size = fileSystem->GetFileSize(); - char *buffer = new char[size]; - fileSystem->ReadFile(buffer, size); - sample->mSample = FSOUND_Sample_Load(FSOUND_UNMANAGED, buffer, FSOUND_LOADMEMORY, 0, size); - - delete[] buffer; - fileSystem->CloseFile(); - } - else - sample->mSample = NULL; - - } - - return sample; -} - - -void JSoundSystem::PlaySample(JSample *sample) -{ - if (sample && sample->mSample){ - int channel = FSOUND_PlaySound(FSOUND_FREE, sample->mSample); - FSOUND_SetVolumeAbsolute(channel,mSampleVolume * 2.55); - } -} - diff --git a/JGE/src/linux/JGfx.cpp b/JGE/src/pc/JGfx.cpp similarity index 99% rename from JGE/src/linux/JGfx.cpp rename to JGE/src/pc/JGfx.cpp index b934e2c75..8baa84133 100644 --- a/JGE/src/linux/JGfx.cpp +++ b/JGE/src/pc/JGfx.cpp @@ -8,6 +8,14 @@ // //------------------------------------------------------------------------------------- +#ifdef WIN32 + #pragma warning(disable : 4786) + extern int actualWidth; + extern int actualHeight; + #pragma comment( lib, "giflib.lib" ) +#endif + + #include "../../Dependencies/include/png.h" #include "../../Dependencies/include/fmod.h" @@ -29,7 +37,7 @@ extern "C" { #include "../../include/JFileSystem.h" #include "../../include/JAssert.h" -#ifdef WIN23 +#ifdef WIN32 #ifndef __attribute__ #define __attribute__((a)) #endif diff --git a/JGE/src/win/JSoundSystem_Win.cpp b/JGE/src/pc/JSfx.cpp similarity index 100% rename from JGE/src/win/JSoundSystem_Win.cpp rename to JGE/src/pc/JSfx.cpp diff --git a/JGE/src/win/JSocket_Win.cpp b/JGE/src/pc/JSocket.cpp similarity index 100% rename from JGE/src/win/JSocket_Win.cpp rename to JGE/src/pc/JSocket.cpp diff --git a/JGE/src/win/JRenderer_Win.cpp b/JGE/src/win/JRenderer_Win.cpp deleted file mode 100644 index 41786ba87..000000000 --- a/JGE/src/win/JRenderer_Win.cpp +++ /dev/null @@ -1,1746 +0,0 @@ -//------------------------------------------------------------------------------------- -// -// JGE++ is a hardware accelerated 2D game SDK for PSP/Windows. -// -// Licensed under the BSD license, see LICENSE in root folder for details. -// -// Copyright (c) 2007 James Hui (a.k.a. Dr.Watson) -// -//------------------------------------------------------------------------------------- - -#ifdef WIN32 - #pragma warning(disable : 4786) -extern int actualWidth; -extern int actualHeight; -#endif - -#include "../../Dependencies/include/png.h" -#include "../../Dependencies/include/fmod.h" - -#ifdef __cplusplus -extern "C" { -#endif - -#define XMD_H -#include - -#ifdef __cplusplus -} -#endif - - -#include "../../include/JGE.h" -#include "../../include/JRenderer.h" -#include "../../include/JResourceManager.h" -#include "../../include/JFileSystem.h" -#include "../../include/JAssert.h" - -#pragma comment( lib, "giflib.lib" ) - -JQuad::JQuad(JTexture *tex, float x, float y, float width, float height) - :mTex(tex), mX(x), mY(y), mWidth(width), mHeight(height) -{ - - JASSERT(tex != NULL); - - mHotSpotX = 0.0f; - mHotSpotY = 0.0f; - //mBlend = BLEND_DEFAULT; - for (int i=0;i<4;i++) - mColor[i].color = 0xFFFFFFFF; - - mHFlipped = false; - mVFlipped = false; - - SetTextureRect(x, y, width, height); - -} - -void JQuad::SetTextureRect(float x, float y, float w, float h) -{ - mX = x; - mY = y; - mWidth = w; - mHeight = h; - - mTX0 = x/mTex->mTexWidth; - mTY0 = y/mTex->mTexHeight; - mTX1 = (x+w)/mTex->mTexWidth; - mTY1 = (y+h)/mTex->mTexHeight; - -} - - -void JQuad::GetTextureRect(float *x, float *y, float *w, float *h) -{ - *x=mX; *y=mY; *w=mWidth; *h=mHeight; -} - -void JQuad::SetColor(PIXEL_TYPE color) -{ - for (int i=0;i<4;i++) - mColor[i].color = color; -} - -void JQuad::SetHotSpot(float x, float y) -{ - mHotSpotX = x; - mHotSpotY = y; -} - - -////////////////////////////////////////////////////////////////////////// - -JTexture::JTexture() -{ - mTexId = -1; -} - -JTexture::~JTexture() -{ - if (mTexId != -1) - glDeleteTextures(1, &mTexId); -} - - -void JTexture::UpdateBits(int x, int y, int width, int height, PIXEL_TYPE* bits) -{ - JRenderer::GetInstance()->BindTexture(this); - glTexSubImage2D(GL_TEXTURE_2D, 0, x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, bits); - -} - -////////////////////////////////////////////////////////////////////////// - -JRenderer* JRenderer::mInstance = NULL; -bool JRenderer::m3DEnabled = false; - -void JRenderer::Set3DFlag(bool flag) { m3DEnabled = flag; } - -JRenderer* JRenderer::GetInstance() -{ - if (mInstance == NULL) - { - mInstance = new JRenderer(); - - JASSERT(mInstance != NULL); - - mInstance->InitRenderer(); - } - - return mInstance; -} - - -void JRenderer::Destroy() -{ - if (mInstance) - { - mInstance->DestroyRenderer(); - delete mInstance; - mInstance = NULL; - } -} - -JRenderer::JRenderer() -{ -} - - -JRenderer::~JRenderer() -{ - -} - - -void JRenderer::InitRenderer() -{ - mCurrentTextureFilter = TEX_FILTER_NONE; - mImageFilter = NULL; - - mCurrTexBlendSrc = BLEND_SRC_ALPHA; - mCurrTexBlendDest = BLEND_ONE_MINUS_SRC_ALPHA; - -// mLineWidth = 1.0f; - mCurrentTex = -1; - mFOV = 75.0f; - -#ifdef USING_MATH_TABLE - for (int i=0;i<360;i++) - { - mSinTable[i] = sinf(i*DEG2RAD); - mCosTable[i] = cosf(i*DEG2RAD); - } -#endif - - mCurrentRenderMode = MODE_UNKNOWN; -} - -void JRenderer::DestroyRenderer() -{ - -} - -void JRenderer::BeginScene() -{ - glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer - glLoadIdentity ();// Reset The Modelview Matrix - float scaleH = (float)actualHeight/SCREEN_HEIGHT_F; - float scaleW = (float)actualWidth/SCREEN_WIDTH_F; - glScalef(scaleW,scaleW,1.f); -} - - -void JRenderer::EndScene() -{ - - glFlush (); -} - -void JRenderer::BindTexture(JTexture *tex) -{ - - if (mCurrentTex != tex->mTexId) - { - mCurrentTex = tex->mTexId; - glBindTexture(GL_TEXTURE_2D, tex->mTexId); - - //if (mCurrentTextureFilter != tex->mFilter) - { - //mCurrentTextureFilter = tex->mFilter; - if (mCurrentTextureFilter == TEX_FILTER_LINEAR) - { - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - } - else if (mCurrentTextureFilter == TEX_FILTER_NEAREST) - { - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST); - } - } - } -} - - -void JRenderer::EnableTextureFilter(bool flag) -{ - if (flag) - mCurrentTextureFilter = TEX_FILTER_LINEAR; - else - mCurrentTextureFilter = TEX_FILTER_NEAREST; - - mCurrentTex = -1; -} - -void Swap(float *a, float *b) -{ - float n=*a; - *a = *b; - *b = n; -} - - -void JRenderer::RenderQuad(JQuad* quad, float xo, float yo, float angle, float xScale, float yScale) -{ - //yo = SCREEN_HEIGHT-yo-1;//-(quad->mHeight); - float width = quad->mWidth; - float height = quad->mHeight; - float x = -quad->mHotSpotX; - float y = quad->mHotSpotY; - - Vector2D pt[4]; - pt[3] = Vector2D(x, y); - pt[2] = Vector2D(x+width, y); - pt[1] = Vector2D(x+width, y-height); - pt[0] = Vector2D(x, y-height); - -// if (angle != 0.0f) -// { -// float xx, yy; -// float cosAngle = cosf(angle); -// float sinAngle = sinf(angle); -// for (int i=0;i<4;i++) -// { -// xx = (cosAngle*(pt[i].x-xo) - sinAngle*(pt[i].y-yo) + xo); -// yy = (sinAngle*(pt[i].x-xo) + cosAngle*(pt[i].y-yo) + yo); -// pt[i].x = xx; -// pt[i].y = yy; -// } -// } -// -// for (int i=0;i<4;i++) -// pt[i].y = SCREEN_HEIGHT_F - pt[i].y; - - Vector2D uv[4]; - uv[0] = Vector2D(quad->mTX0, quad->mTY1); - uv[1] = Vector2D(quad->mTX1, quad->mTY1); - uv[2] = Vector2D(quad->mTX1, quad->mTY0); - uv[3] = Vector2D(quad->mTX0, quad->mTY0); - - if (quad->mHFlipped) - { - Swap(&uv[0].x, &uv[1].x); - Swap(&uv[2].x, &uv[3].x); - } - - if (quad->mVFlipped) - { - Swap(&uv[0].y, &uv[2].y); - Swap(&uv[1].y, &uv[3].y); - } - - - //glEnable(GL_BLEND); - //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); - - BindTexture(quad->mTex); - - - ////glRasterPos2f(x, y); - - - yo = SCREEN_HEIGHT_F - yo; - - glPushMatrix(); - glTranslatef(xo, yo, 0.0f); - glRotatef(-angle*RAD2DEG, 0.0f, 0.0f, 1.0f); - glScalef(xScale, yScale, 1.0f); - - glBegin(GL_QUADS); - // bottom left corner - glColor4ub(quad->mColor[0].r, quad->mColor[0].g, quad->mColor[0].b, quad->mColor[0].a); - glTexCoord2f(uv[0].x, uv[0].y); glVertex2f(pt[0].x, pt[0].y); - - // bottom right corner - glColor4ub(quad->mColor[1].r, quad->mColor[1].g, quad->mColor[1].b, quad->mColor[1].a); - glTexCoord2f(uv[1].x, uv[1].y); glVertex2f(pt[1].x, pt[1].y); - - // top right corner - glColor4ub(quad->mColor[2].r, quad->mColor[2].g, quad->mColor[2].b, quad->mColor[2].a); - glTexCoord2f(uv[2].x, uv[2].y); glVertex2f(pt[2].x, pt[2].y); - - // top left corner - glColor4ub(quad->mColor[3].r, quad->mColor[3].g, quad->mColor[3].b, quad->mColor[3].a); - glTexCoord2f(uv[3].x, uv[3].y); glVertex2f(pt[3].x, pt[3].y); - glEnd(); - - glPopMatrix(); - - //glDisable(GL_BLEND); - - // default color - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::RenderQuad(JQuad* quad, VertexColor* pt) -{ - - for (int i=0;i<4;i++) - { - pt[i].y = SCREEN_HEIGHT_F - pt[i].y; - quad->mColor[i].color = pt[i].color; - } - - Vector2D uv[4]; - uv[0] = Vector2D(quad->mTX0, quad->mTY1); - uv[1] = Vector2D(quad->mTX1, quad->mTY1); - uv[2] = Vector2D(quad->mTX1, quad->mTY0); - uv[3] = Vector2D(quad->mTX0, quad->mTY0); - - BindTexture(quad->mTex); - - glRasterPos2f(pt[0].x, pt[0].y); - - //float w = quad->mWidth; - //float h = quad->mHeight; - - glBegin(GL_QUADS); - // bottom left corner - glColor4ub(quad->mColor[0].r, quad->mColor[0].g, quad->mColor[0].b, quad->mColor[0].a); - glTexCoord2f(uv[0].x, uv[0].y); glVertex2f(pt[0].x, pt[0].y); - - // bottom right corner - glColor4ub(quad->mColor[1].r, quad->mColor[1].g, quad->mColor[1].b, quad->mColor[1].a); - glTexCoord2f(uv[1].x, uv[1].y); glVertex2f(pt[1].x, pt[1].y); - - // top right corner - glColor4ub(quad->mColor[2].r, quad->mColor[2].g, quad->mColor[2].b, quad->mColor[2].a); - glTexCoord2f(uv[2].x, uv[2].y); glVertex2f(pt[2].x, pt[2].y); - - // top left corner - glColor4ub(quad->mColor[3].r, quad->mColor[3].g, quad->mColor[3].b, quad->mColor[3].a); - glTexCoord2f(uv[3].x, uv[3].y); glVertex2f(pt[3].x, pt[3].y); - glEnd(); - - //glDisable(GL_BLEND); - - // default color - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::FillRect(float x, float y, float width, float height, PIXEL_TYPE color) -{ - y = SCREEN_HEIGHT_F - y - height; - - JColor col; - col.color = color; - - glDisable(GL_TEXTURE_2D); - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_QUADS); - // top left corner - glVertex2f(x, y+height); - - // bottom left corner - glVertex2f(x, y); - - // bottom right corner - glVertex2f(x+width, y); - - // top right corner - glVertex2f(x+width, y+height); - - glEnd(); - - glEnable(GL_TEXTURE_2D); - - // default color - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::DrawRect(float x, float y, float width, float height, PIXEL_TYPE color) -{ - y = SCREEN_HEIGHT_F - y - height; - - JColor col; - col.color = color; - - glDisable(GL_TEXTURE_2D); - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_LINES); - - glVertex2f(x, y); - glVertex2f(x, y+height); - - glVertex2f(x, y+height); - glVertex2f(x+width, y+height); - - glVertex2f(x+width, y+height); - glVertex2f(x+width, y); - - glVertex2f(x+width, y); - glVertex2f(x, y); - - glEnd(); - - glEnable(GL_TEXTURE_2D); - - // default color - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::FillRect(float x, float y, float width, float height, PIXEL_TYPE* colors) -{ - JColor col[4]; - for (int i=0;i<4;i++) - col[i].color = colors[i]; - - FillRect(x, y, width, height, col); -} - - -void JRenderer::FillRect(float x, float y, float width, float height, JColor* colors) -{ - y = SCREEN_HEIGHT_F - y - height; - - glDisable(GL_TEXTURE_2D); - glBegin(GL_QUADS); - // top left corner - glColor4ub(colors[0].r, colors[0].g, colors[0].b, colors[0].a); - glVertex2f(x, y+height); - - // bottom left corner - glColor4ub(colors[2].r, colors[2].g, colors[2].b, colors[2].a); - glVertex2f(x, y); - - // bottom right corner - glColor4ub(colors[3].r, colors[3].g, colors[3].b, colors[3].a); - glVertex2f(x+width, y); - - // top right corner - glColor4ub(colors[1].r, colors[1].g, colors[1].b, colors[1].a); - glVertex2f(x+width, y+height); - - glEnd(); - - glEnable(GL_TEXTURE_2D); - - //glDisable(GL_BLEND); - - // default color - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::DrawLine(float x1, float y1, float x2, float y2, PIXEL_TYPE color) -{ -// glLineWidth (mLineWidth); - glDisable(GL_TEXTURE_2D); - JColor col; - col.color = color; - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_LINES); - glVertex2f(x1, SCREEN_HEIGHT_F-y1); - glVertex2f(x2, SCREEN_HEIGHT_F-y2); - glEnd(); - glEnable(GL_TEXTURE_2D); - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::Plot(float x, float y, PIXEL_TYPE color) -{ - glDisable(GL_TEXTURE_2D); - JColor col; - col.color = color; - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_POINTS); - glVertex2f(x, SCREEN_HEIGHT_F-y); - glEnd(); - glEnable(GL_TEXTURE_2D); - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::PlotArray(float *x, float *y, int count, PIXEL_TYPE color) -{ - glDisable(GL_TEXTURE_2D); - JColor col; - col.color = color; - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_POINTS); - for (int i=0;i>= 1; - b = 1 << n; - if (b == 2 * width) b >>= 1; - return b; -} - - - - -static void jpg_null(j_decompress_ptr cinfo) -{ -} - -static unsigned char jpg_fill_input_buffer(j_decompress_ptr cinfo) -{ - //// ri.Con_Printf(PRINT_ALL, "Premature end of JPEG data\n"); - return 1; -} - -static void jpg_skip_input_data(j_decompress_ptr cinfo, long num_bytes) -{ - - cinfo->src->next_input_byte += (size_t) num_bytes; - cinfo->src->bytes_in_buffer -= (size_t) num_bytes; - - //// if (cinfo->src->bytes_in_buffer < 0) - //// ri.Con_Printf(PRINT_ALL, "Premature end of JPEG data\n"); -} - -static void jpeg_mem_src(j_decompress_ptr cinfo, byte *mem, int len) -{ - cinfo->src = (struct jpeg_source_mgr *)(*cinfo->mem->alloc_small)((j_common_ptr) cinfo, JPOOL_PERMANENT, sizeof(struct jpeg_source_mgr)); - cinfo->src->init_source = jpg_null; - cinfo->src->fill_input_buffer = jpg_fill_input_buffer; - cinfo->src->skip_input_data = jpg_skip_input_data; - cinfo->src->resync_to_restart = jpeg_resync_to_restart; - cinfo->src->term_source = jpg_null; - cinfo->src->bytes_in_buffer = len; - cinfo->src->next_input_byte = mem; -} - -/* -============== -LoadJPG -============== -*/ -void JRenderer::LoadJPG(TextureInfo &textureInfo, const char *filename, int mode, int TextureFormat) -{ - - - - textureInfo.mBits = NULL; - - struct jpeg_decompress_struct cinfo; - struct jpeg_error_mgr jerr; - BYTE *rawdata, *rgbadata, *scanline, *p, *q; - int rawsize, i; - -// char filenamenew[4096]; -// sprintf(filenamenew, "Res/%s", filename); - - - - - JFileSystem* fileSystem = JFileSystem::GetInstance(); - if (!fileSystem->OpenFile(filename)) - { - return; - } - - rawsize = fileSystem->GetFileSize(); - - rawdata = new BYTE[rawsize]; - - if (!rawdata) - { - fileSystem->CloseFile(); - return; - } - - fileSystem->ReadFile(rawdata, rawsize); - fileSystem->CloseFile(); - - /* if (rawdata[6] != 'J' || rawdata[7] != 'F' || rawdata[8] != 'I' || rawdata[9] != 'F') - { - delete [] rawdata; - return; - } */ - - // Initialise libJpeg Object - cinfo.err = jpeg_std_error(&jerr); - jpeg_create_decompress(&cinfo); - - /* -FILE* fp = fopen(filenamenew, "rb"); - if (fp == NULL) - { - //Failed to open file - return; - } - - jpeg_stdio_src(&cinfo, fp); - */ - -jpeg_mem_src(&cinfo, rawdata, rawsize); - - // Process JPEG header - jpeg_read_header(&cinfo, true); - - - - - // Start Decompression - jpeg_start_decompress(&cinfo); - - // Check Colour Components - if(cinfo.output_components != 3 && cinfo.output_components != 4) - { - //// ri.Con_Printf(PRINT_ALL, "Invalid JPEG colour components\n"); - jpeg_destroy_decompress(&cinfo); - //// ri.FS_FreeFile(rawdata); - return; - } - - int tw = getNextPower2(cinfo.output_width); - int th = getNextPower2(cinfo.output_height); - - - // Allocate Memory for decompressed image - rgbadata = new BYTE[tw * th * 4]; - if(!rgbadata) - { - //// ri.Con_Printf(PRINT_ALL, "Insufficient RAM for JPEG buffer\n"); - jpeg_destroy_decompress(&cinfo); - //// ri.FS_FreeFile(rawdata); - delete [] rgbadata; - return; - } - - - // Pass sizes to output - - // Allocate Scanline buffer - scanline = (byte *)malloc(cinfo.output_width * 3); - if(!scanline) - { - //// ri.Con_Printf(PRINT_ALL, "Insufficient RAM for JPEG scanline buffer\n"); - - jpeg_destroy_decompress(&cinfo); - //// ri.FS_FreeFile(rawdata); - - delete [] rgbadata; - return; - } - - // Read Scanlines, and expand from RGB to RGBA - BYTE* currRow = rgbadata; - - while(cinfo.output_scanline < cinfo.output_height) - { - p = scanline; - jpeg_read_scanlines(&cinfo, &scanline, 1); - - q = currRow; - for(i=0; i<(int)cinfo.output_width; i++) - { - q[0] = p[0]; - q[1] = p[1]; - q[2] = p[2]; - q[3] = 255; - - p+=3; q+=4; - } - currRow += tw*4; - } - - // Free the scanline buffer - free(scanline); - - - - - - - - - - textureInfo.mBits = rgbadata; - textureInfo.mWidth = cinfo.output_width; - textureInfo.mHeight = cinfo.output_height; - textureInfo.mTexWidth = tw; - textureInfo.mTexHeight = th; - - - // Finish Decompression - try{ - jpeg_finish_decompress(&cinfo); - }catch(...){} - // Destroy JPEG object - jpeg_destroy_decompress(&cinfo); - -//fclose(fp); -delete [] rawdata; - -} - - -static void PNGCustomWarningFn(png_structp png_ptr, png_const_charp warning_msg) -{ - // ignore PNG warnings -} - - -static void PNGCustomReadDataFn(png_structp png_ptr, png_bytep data, png_size_t length) -{ - png_size_t check; - - JFileSystem *fileSystem = (JFileSystem*)png_ptr->io_ptr; - - check = fileSystem->ReadFile(data, length); - - if (check != length) - { - png_error(png_ptr, "Read Error!"); - } -} - - -JTexture* JRenderer::LoadTexture(const char* filename, int mode, int TextureFormat) -{ - TextureInfo textureInfo; - - textureInfo.mBits = NULL; - - if (strstr(filename, ".jpg")!=NULL || strstr(filename, ".JPG")!=NULL) - LoadJPG(textureInfo, filename); - else if(strstr(filename, ".gif")!=NULL || strstr(filename, ".GIF")!=NULL) - LoadGIF(textureInfo,filename); - else if(strstr(filename, ".png")!=NULL || strstr(filename, ".PNG")!=NULL) - LoadPNG(textureInfo, filename); - - if (textureInfo.mBits == NULL) - return NULL; - - bool ret = false; - - JTexture *tex = new JTexture(); - - if (tex) - { - if (mImageFilter != NULL) - mImageFilter->ProcessImage((PIXEL_TYPE*)textureInfo.mBits, textureInfo.mWidth, textureInfo.mHeight); - - tex->mFilter = TEX_FILTER_LINEAR; - tex->mWidth = textureInfo.mWidth; - tex->mHeight = textureInfo.mHeight; - tex->mTexWidth = textureInfo.mTexWidth; - tex->mTexHeight = textureInfo.mTexHeight; - - GLuint texid; - glGenTextures(1, &texid); - tex->mTexId = texid; - - if (texid != 0) - { - - // OpenGL texture has (0,0) at lower-left - // Pay attention when doing texture mapping!!! - - glBindTexture(GL_TEXTURE_2D, texid); // Bind To The Texture ID - - - if (mode == TEX_TYPE_MIPMAP) // generate mipmaps - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); - gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, textureInfo.mTexWidth, textureInfo.mTexHeight, GL_RGBA, GL_UNSIGNED_BYTE, textureInfo.mBits); - } - else if (mode == TEX_TYPE_SKYBOX) // for skybox - { -#define GL_CLAMP_TO_EDGE 0x812F - - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, textureInfo.mTexWidth, textureInfo.mTexHeight, GL_RGBA, GL_UNSIGNED_BYTE, textureInfo.mBits); - } - else // single texture - { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureInfo.mTexWidth, textureInfo.mTexHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureInfo.mBits); - } - - ret = TRUE; - - } - - - } - - delete [] textureInfo.mBits; - //delete textureInfo; - - if (!ret) - { - if (tex) - delete tex; - tex = NULL; - } - - return tex; -} - -void JRenderer::LoadPNG(TextureInfo &textureInfo, const char *filename, int mode, int TextureFormat) -{ - //TextureInfo* textureInfo = new TextureInfo; - - //if (textureInfo == NULL) return NULL; - - textureInfo.mBits = NULL; - - BOOL ret = FALSE; - - DWORD* p32; - - png_structp png_ptr; - png_infop info_ptr; - unsigned int sig_read = 0; - png_uint_32 width, height, tw, th; - int bit_depth, color_type, interlace_type, x, y; - DWORD* line; - //FILE *fp; - - - //if ((fp = fopen(filename, "rb")) == NULL) return NULL; - JFileSystem* fileSystem = JFileSystem::GetInstance(); - if (!fileSystem->OpenFile(filename)) return; - - png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (png_ptr == NULL) - { - //fclose(fp); - fileSystem->CloseFile(); - - return; - } - - png_set_error_fn(png_ptr, (png_voidp) NULL, (png_error_ptr) NULL, PNGCustomWarningFn); - info_ptr = png_create_info_struct(png_ptr); - if (info_ptr == NULL) - { - //fclose(fp); - fileSystem->CloseFile(); - - png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL); - - return; - } - png_init_io(png_ptr, NULL); - png_set_read_fn(png_ptr, (png_voidp)fileSystem, PNGCustomReadDataFn); - - png_set_sig_bytes(png_ptr, sig_read); - png_read_info(png_ptr, info_ptr); - png_get_IHDR(png_ptr, info_ptr, &width, &height, &bit_depth, &color_type, &interlace_type, int_p_NULL, int_p_NULL); - png_set_strip_16(png_ptr); - png_set_packing(png_ptr); - if (color_type == PNG_COLOR_TYPE_PALETTE) png_set_palette_to_rgb(png_ptr); - if (color_type == PNG_COLOR_TYPE_GRAY && bit_depth < 8) png_set_gray_1_2_4_to_8(png_ptr); - if (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)) png_set_tRNS_to_alpha(png_ptr); - png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER); - - line = (DWORD*) malloc(width * 4); - if (!line) - { - //fclose(fp); - fileSystem->CloseFile(); - - png_destroy_read_struct(&png_ptr, png_infopp_NULL, png_infopp_NULL); - return; - } - - - tw = getNextPower2(width); - th = getNextPower2(height); - - int size = tw * th * 4; // RGBA - - BYTE* buffer = new BYTE[size]; - - //JTexture *tex = new JTexture(); - - if (buffer) - { -// tex->mFilter = TEX_FILTER_LINEAR; -// tex->mWidth = width; -// tex->mHeight = height; -// tex->mTexWidth = tw; -// tex->mTexHeight = th; - -// GLuint texid; -// glGenTextures(1, &texid); -// tex->mTexId = texid; - -// if (texid != 0) - { - - // OpenGL texture has (0,0) at lower-left - // Pay attention when doing texture mapping!!! - - p32 = (DWORD*) buffer;// + (height-1)*width; - - for (y = 0; y < (int)height; y++) - { - png_read_row(png_ptr, (BYTE*) line, png_bytep_NULL); - for (x = 0; x < (int)width; x++) - { - DWORD color32 = line[x]; - //u16 color16; - int a = (color32 >> 24) & 0xff; - int r = color32 & 0xff; - int g = (color32 >> 8) & 0xff; - int b = (color32 >> 16) & 0xff; - - color32 = r | (g << 8) | (b << 16) | (a << 24); - *(p32+x) = color32; - - } - p32 += tw; - - } - - -// glBindTexture(GL_TEXTURE_2D, texid); // Bind To The Texture ID -// -// -// if (mode == TEX_TYPE_MIPMAP) // generate mipmaps -// { -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); -// glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); -// glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); -// gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, tw, th, GL_RGBA, GL_UNSIGNED_BYTE, buffer); -// } -// else if (mode == TEX_TYPE_SKYBOX) // for skybox -// { -// #define GL_CLAMP_TO_EDGE 0x812F -// -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); -// gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, tw, th, GL_RGBA, GL_UNSIGNED_BYTE, buffer); -// } -// else // single texture -// { -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); -// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); -// glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); -// glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); -// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tw, th, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); -// } - -// ret = TRUE; - - } - -// delete buffer; - - } - - free (line); - - png_read_end(png_ptr, info_ptr); - png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); - - //fclose(fp); - fileSystem->CloseFile(); - -// if (!ret) -// { -// if (tex) -// delete tex; -// tex = NULL; -// } -// -// return tex; - - textureInfo.mBits = buffer; - textureInfo.mWidth = width; - textureInfo.mHeight = height; - textureInfo.mTexWidth = tw; - textureInfo.mTexHeight = th; - - //return textureInfo; - -} - - -// void JRenderer::FreeTexture(JTexture* tex) -// { -// glDeleteTextures(1, &tex->mTexId); -// -// delete tex; -// tex = NULL; -// } - - - -////////////////////////////////////////////////////////////////////////// -/// GIF Support -int JRenderer::image_readgif(void * handle, TextureInfo &textureInfo, DWORD * bgcolor, InputFunc readFunc,int mode, int TextureFormat) -{ - - // pixel ** image_data=NULL; - DWORD *p32=NULL; - DWORD *buff=NULL; - //#define gif_color(c) RGB(palette->Colors[c].Red, palette->Colors[c].Green, palette->Colors[c].Blue) -#define gif_color32(c) ARGB(255,palette->Colors[c].Blue,palette->Colors[c].Green, palette->Colors[c].Red) - GifRecordType RecordType; - GifByteType *Extension; - GifRowType LineIn = NULL; - GifFileType *GifFileIn = NULL; - ColorMapObject *palette; - int ExtCode; - DWORD i, j; - if ((GifFileIn = DGifOpen(handle, readFunc)) == NULL) - return 1; - *bgcolor = 0; - textureInfo.mWidth = 0; - textureInfo.mHeight = 0; - //*image_data = NULL; - - do { - if (DGifGetRecordType(GifFileIn, &RecordType) == GIF_ERROR) - { - DGifCloseFile(GifFileIn); - return 1; - } - - switch (RecordType) { - case IMAGE_DESC_RECORD_TYPE: - { - if (DGifGetImageDesc(GifFileIn) == GIF_ERROR) - { - DGifCloseFile(GifFileIn); - return 1; - } - if((palette = (GifFileIn->SColorMap != NULL) ? GifFileIn->SColorMap : GifFileIn->Image.ColorMap) == NULL) - { - DGifCloseFile(GifFileIn); - return 1; - } - textureInfo.mWidth = GifFileIn->Image.Width; - textureInfo.mHeight = GifFileIn->Image.Height; - *bgcolor = gif_color32(GifFileIn->SBackGroundColor); - if((LineIn = (GifRowType) malloc(GifFileIn->Image.Width * sizeof(GifPixelType))) == NULL) - { - DGifCloseFile(GifFileIn); - return 1; - } - textureInfo.mTexWidth = getNextPower2(GifFileIn->Image.Width); - textureInfo.mTexHeight = getNextPower2(GifFileIn->Image.Height); - - //if((*image_data = (pixel *)malloc(sizeof(pixel) * GifFileIn->Image.Width * GifFileIn->Image.Height)) == NULL) - if((p32 = (DWORD *)malloc(sizeof(PIXEL_TYPE) * textureInfo.mTexWidth * textureInfo.mTexHeight)) == NULL) - { - free((void *)LineIn); - DGifCloseFile(GifFileIn); - return 1; - } - DWORD * curr = p32; - DWORD * imgdata; - for (i = 0; i < GifFileIn->Image.Height; i ++) - { - imgdata = curr; - if (DGifGetLine(GifFileIn, LineIn, GifFileIn->Image.Width) == GIF_ERROR) - { - free((void *)p32); - free((void *)LineIn); - DGifCloseFile(GifFileIn); - return 1; - } - for(j = 0; j < GifFileIn->Image.Width; j ++) - { - DWORD color32 = gif_color32(LineIn[j]); - - //if(mTexLoadingCB) mTexLoadingCB(color32); - //if(JRenderer::GetInstance()->GetTextureLoadingCallback()) - // JRenderer::GetInstance()->GetTextureLoadingCallback()(color32); - - *imgdata++ = color32; - } - - curr += textureInfo.mTexWidth; - } - textureInfo.mBits = (u8 *)p32; - break; - } - case EXTENSION_RECORD_TYPE: - if (DGifGetExtension(GifFileIn, &ExtCode, &Extension) == GIF_ERROR) - { - if(textureInfo.mBits != NULL) - { - free((void *)textureInfo.mBits); - textureInfo.mBits = NULL; - } - if(LineIn != NULL) - free((void *)LineIn); - DGifCloseFile(GifFileIn); - return 1; - } - while (Extension != NULL) { - if (DGifGetExtensionNext(GifFileIn, &Extension) == GIF_ERROR) - { - if(textureInfo.mBits != NULL) - { - free((void *)textureInfo.mBits); - textureInfo.mBits = NULL; - } - if(LineIn != NULL) - free((void *)LineIn); - DGifCloseFile(GifFileIn); - return 1; - } - } - break; - case TERMINATE_RECORD_TYPE: - break; - default: - break; - } - } - while (RecordType != TERMINATE_RECORD_TYPE); - - if(LineIn != NULL) - free((void *)LineIn); - DGifCloseFile(GifFileIn); - - return 0; -} - -int image_gif_read(GifFileType * ft, GifByteType * buf, int size) -{ - JFileSystem *fileSys = (JFileSystem *)ft->UserData; - //return fread(buf, 1, size, (FILE *)ft->UserData); - if (fileSys->ReadFile(buf, size)) - return size; - else - return 0; - -} - -void JRenderer::LoadGIF(TextureInfo &textureInfo, const char *filename, int mode, int TextureFormat) -{ - ///* - //FILE * fp = fopen(filename, "rb"); - JFileSystem *fileSys = JFileSystem::GetInstance(); - if (!fileSys->OpenFile(filename)) - return; - - //if(fp == NULL) - // return; - DWORD bkcol; - int result = image_readgif(fileSys, textureInfo, &bkcol, image_gif_read, mode); - if(result!=0) - textureInfo.mBits=NULL; - //fclose(fp); - fileSys->CloseFile(); - return ;//*/ -} - - - -JTexture* JRenderer::CreateTexture(int width, int height, int mode ) -{ - int size = width * height * sizeof(PIXEL_TYPE); // RGBA - - BYTE* buffer = new BYTE[size]; - - JTexture *tex = new JTexture(); - - if (buffer && tex) - { - tex->mFilter = TEX_FILTER_LINEAR; - tex->mWidth = width; - tex->mHeight = height; - tex->mTexWidth = width; - tex->mTexHeight = height; - - GLuint texid; - glGenTextures(1, &texid); - tex->mTexId = texid; - - memset(buffer, 0, size); - - glBindTexture(GL_TEXTURE_2D, texid); - - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); - glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer); - - delete buffer; - - return tex; - } - else - return NULL; -} - - -void JRenderer::EnableVSync(bool flag) -{ -// if (flag) -// hge->System_SetState(HGE_FPS, 60); // HGEFPS_VSYNC -// else -// hge->System_SetState(HGE_FPS, HGEFPS_UNLIMITED); -} - - -void JRenderer::ClearScreen(PIXEL_TYPE color) -{ - FillRect(0.0f, 0.0f, SCREEN_WIDTH_F, SCREEN_HEIGHT_F, color); -} - - -void JRenderer::SetTexBlend(int src, int dest) -{ - if (src != mCurrTexBlendSrc || dest != mCurrTexBlendDest) - { - mCurrTexBlendSrc = src; - mCurrTexBlendDest = dest; - - glBlendFunc(src, dest); - } -} - - -void JRenderer::SetTexBlendSrc(int src) -{ - if (src != mCurrTexBlendSrc) - { - mCurrTexBlendSrc = src; - glBlendFunc(mCurrTexBlendSrc, mCurrTexBlendDest); - } -} - - -void JRenderer::SetTexBlendDest(int dest) -{ - if (dest != mCurrTexBlendDest) - { - mCurrTexBlendDest = dest; - glBlendFunc(mCurrTexBlendSrc, mCurrTexBlendDest); - } -} - - -void JRenderer::Enable2D() -{ - if (mCurrentRenderMode == MODE_2D) - return; - - mCurrentRenderMode = MODE_2D; - - glViewport (0, 0, (GLsizei)SCREEN_WIDTH, (GLsizei)SCREEN_HEIGHT); // Reset The Current Viewport - glMatrixMode (GL_PROJECTION); // Select The Projection Matrix - glLoadIdentity (); // Reset The Projection Matrix - - gluOrtho2D(0.0f, SCREEN_WIDTH_F, 0.0f, SCREEN_HEIGHT_F); - - glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix - glLoadIdentity (); // Reset The Modelview Matrix - - glDisable (GL_DEPTH_TEST); -} - - -void JRenderer::Enable3D() -{ - if (!m3DEnabled) - return; - - if (mCurrentRenderMode == MODE_3D) - return; - - mCurrentRenderMode = MODE_3D; - - glViewport (0, 0, (GLsizei)SCREEN_WIDTH, (GLsizei)SCREEN_HEIGHT); // Reset The Current Viewport - glMatrixMode (GL_PROJECTION); // Select The Projection Matrix - glLoadIdentity (); // Reset The Projection Matrix - gluPerspective (mFOV, (GLfloat)SCREEN_WIDTH/(GLfloat)SCREEN_HEIGHT, // Calculate The Aspect Ratio Of The Window - 0.5f, 1000.0f); - glMatrixMode (GL_MODELVIEW); // Select The Modelview Matrix - glLoadIdentity (); // Reset The Modelview Matrix - - glEnable (GL_DEPTH_TEST); -} - - -void JRenderer::SetClip(int x, int y, int width, int height) -{ - glScissor(x, y, width, height); -} - - -void JRenderer::LoadIdentity() -{ - glLoadIdentity(); -} - - -void JRenderer::Translate(float x, float y, float z) -{ - glTranslatef(x, y, z); -} - - -void JRenderer::RotateX(float angle) -{ - glRotatef(angle*RAD2DEG, 1.0f, 0.0f, 0.0f); -} - - -void JRenderer::RotateY(float angle) -{ - glRotatef(angle*RAD2DEG, 0.0f, 1.0f, 0.0f); -} - - -void JRenderer::RotateZ(float angle) -{ - glRotatef(angle*RAD2DEG, 0.0f, 0.0f, 1.0f); -} - - -void JRenderer::PushMatrix() -{ - glPushMatrix(); -} - - -void JRenderer::PopMatrix() -{ - glPopMatrix(); -} - - -void JRenderer::RenderTriangles(JTexture* texture, Vertex3D *vertices, int start, int count) -{ - if (texture) - BindTexture(texture); - - glBegin(GL_TRIANGLES); - int index = start*3; - for (int i = 0; i < count; i++) - { - glTexCoord2f(vertices[index].u, vertices[index].v); - //glNormal3f(vertices[index].nx, vertices[index].ny, vertices[index].nz); - glVertex3f(vertices[index].x, vertices[index].y, vertices[index].z); - - index++; - - glTexCoord2f(vertices[index].u, vertices[index].v); - //glNormal3f(vertices[index].nx, vertices[index].ny, vertices[index].nz); - glVertex3f(vertices[index].x, vertices[index].y, vertices[index].z); - - index++; - - glTexCoord2f(vertices[index].u, vertices[index].v); - //glNormal3f(vertices[index].nx, vertices[index].ny, vertices[index].nz); - glVertex3f(vertices[index].x, vertices[index].y, vertices[index].z); - - index++; - - } - glEnd(); - -} - - -void JRenderer::SetFOV(float fov) -{ - mFOV = fov; -} - - -void JRenderer::FillPolygon(float* x, float* y, int count, PIXEL_TYPE color) -{ - JColor col; - col.color = color; - - glDisable(GL_TEXTURE_2D); - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_TRIANGLE_FAN); - - for(int i=0; i= 360.0f) - angle -= 360.0f; - } - - glEnd(); - - glEnable(GL_TEXTURE_2D); - - // default color - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::FillPolygon(float x, float y, float size, int count, float startingAngle, PIXEL_TYPE color) -{ - JColor col; - col.color = color; - - float angle = startingAngle*RAD2DEG; - float firstAngle = angle; - float steps = 360.0f/count; - size /= 2; - - glDisable(GL_TEXTURE_2D); - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_TRIANGLE_FAN); - - glVertex2f(x, SCREEN_HEIGHT_F-y); - - for(int i=0; i= 360.0f) - angle -= 360.0f; - } - - glVertex2f(x+size*COSF((int)firstAngle), SCREEN_HEIGHT_F-y+size*SINF((int)firstAngle)); - - - glEnd(); - - glEnable(GL_TEXTURE_2D); - - // default color - glColor4ub(255, 255, 255, 255); -} - - -void JRenderer::SetImageFilter(JImageFilter* imageFilter) -{ - mImageFilter = imageFilter; -} - - - -void JRenderer::DrawRoundRect(float x, float y, float w, float h, float radius, PIXEL_TYPE color) -{ - x+=w+radius; - y+=h+radius; - JColor col; - col.color = color; - - glDisable(GL_TEXTURE_2D); - glColor4ub(col.r, col.g, col.b, col.a); - glBegin(GL_LINE_LOOP); - int i; - for(i=0; i<90;i++) - { - glVertex2f(x+radius*COSF(i), SCREEN_HEIGHT_F-(y+radius*SINF(i))); - } - for(i=0; i