Compare commits

..

No commits in common. "67cd77edf88c9cc1a3e73787271d047a0ac7ff21" and "2390c67fa143a4f02b5613f8490c613ef02e21d0" have entirely different histories.

24 changed files with 152 additions and 179 deletions

13
TODO.md
View file

@ -3,15 +3,15 @@ Common:
- [x] Window implementation
- [x] Fix shader compilation
- [x] Downscale textures
- [ ] Simplify geometry
- [x] Touch controls
- [x] Keyboard controls
- [ ] Audio?
- [x] Menu
- [x] Config
- [x] Merge S60v3 and ^3 branches
- [ ] Simplify geometry
- [ ] Move map to top left corner
- [ ] Do something with sprites, they're still taking too much frame time
- [ ] Audio
GLES 2.0 specific:
- [x] Optimize to always run 10+ fps
@ -19,20 +19,15 @@ GLES 2.0 specific:
- [ ] Optimize to always run 20+ fps
- [ ] Use etc1 compression
- [ ] Fix face animations in optimized builds
- [ ] Skinning shader is still broken on VC4
- [ ] Disappearing background in cutscenes
- [ ] HUD still disappearing sometimes
GLES 1.1 specific:
- [x] Backport to STLport v4
- [x] GLES 1.1 engine
- [x] Keyboard mappings for both QWERTY/12-keys
- [ ] Keyboard mappings for both QWERTY/12-keys
- [ ] Use pvrtc compression
- [ ] Optimize to always run 10+ fps
- [ ] Fix z-buffer issues (world clips through hud)
- [ ] Fix lighting
Issues:
- [x] Fix crash in Texture::destroy on exit
- [x] Save menu is too slow
- [x] HUD disappearing on GLES 2.0 (mostly fixed, was caused by OOM)
- [x] Crash when picking up a bat

View file

@ -2,7 +2,6 @@ PRJ_PLATFORMS
DEFAULT ARMV6
PRJ_MMPFILES
gnumakefile Icons_scalable_dc.mk
gnumakefile shaders.mk
librw_gles2.mmp
re3_gles2.mmp

View file

@ -17,9 +17,8 @@ SRCDBG
OPTION ARMCC --gnu -Otime --diag_suppress 1,68,111,174,381,1293
OPTION_REPLACE ARMCC --cpu 6
OPTION_REPLACE ARMCC --fpu vfpv2 --fpmode fast
// too dangerous!
OPTION_REPLACE ARMCC -O2 -O3
OPTION_REPLACE ARMCC --fpu softvfp+vfpv2 --fpmode fast
OPTION_REPLACE ARMCC -O2 -O3 // too dangerous!
#ifdef ARMCC
ALWAYS_BUILD_AS_ARM
#endif
@ -28,10 +27,10 @@ ALWAYS_BUILD_AS_ARM
SYSTEMINCLUDE /epoc32/include/stdapis/stlportv5
STDCPP
MACRO RW_GL3
MACRO RW_OPENGL
MACRO RW_OPENGL // because carbide is too stupid
#else
SYSTEMINCLUDE /epoc32/include/stdapis/stlport
SYSTEMINCLUDE /epoc32/include/stdapis/stlport/stl
MACRO RW_GLES1
MACRO S60V3
MACRO S60V5
#endif

View file

@ -1,3 +1,4 @@
#undef SYMBIAN3
#define S60V3
TARGET librw_gles1.lib
#include "librw.mmh"

View file

@ -1,3 +1,4 @@
#undef S60V3
#define SYMBIAN_3
TARGET librw_gles2.lib
#include "librw.mmh"

View file

@ -1,4 +1,5 @@
#undef SYMBIAN_3
#define S60V3
//TARGET re3_gles1.exe
TARGET re3_gles1.exe
LIBRARY libstdcpp.lib

View file

@ -1,3 +1,4 @@
#undef S60V3
#define SYMBIAN_3
TARGET re3.exe
LIBRARY libstdcppv5.lib
@ -5,6 +6,5 @@ LIBRARY libglesv2.lib
LIBRARY libegl.lib
LIBRARY platformver.lib
STATICLIBRARY librw_gles2.lib
ARMFPU vfpv2
SMPSAFE
ARMFPU softvfp+vfpv2
#include "re3.mmh"

View file

@ -1,26 +1,22 @@
#{"GTA III"},(0xe0d67647),1,0,1
#{"GTA III"},(0xe0d67647),1,0,0
[0x101F7961], 0, 0, 0, {"S60ProductID"} ; S60v3
[0x1028315F], 0, 0, 0, {"S60ProductID"} ; ^1
[0x20022E6D], 0, 0, 0, {"S60ProductID"} ; ^3
[0x101F7961], 0, 0, 0, {"S60ProductID"}
[0x1028315F], 0, 0, 0, {"S60ProductID"}
[0x20022E6D], 0, 0, 0, {"S60ProductID"}
%{"nnproject"}
:"nnproject"
;IF (NOT package(0x20009A80)) OR (NOT package(0x2002372A)) ; old or missing openc
; "incompatible_openc.txt"-"", FT, FORCEABORT
;ENDIF
;IF exists("z:\system\install\Series60v5.2.sis") AND exists("z:\sys\bin\libGLESv2.dll")
; "$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\re3.exe"-"!:\sys\bin\re3.exe"
;ELSE
; "$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\re3_gles1.exe"-"!:\sys\bin\re3.exe"
;ENDIF
"$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\re3_gles1.exe"-"!:\sys\bin\re3.exe"
"$(EPOCROOT)\epoc32\data\z\private\10003a3f\import\apps\re3_reg.rsc" - "!:\private\10003a3f\import\apps\re3_reg.rsc"
"$(EPOCROOT)\epoc32\data\z\resource\apps\re3.rsc" - "!:\resource\apps\re3.rsc"
"$(EPOCROOT)\epoc32\data\z\resource\apps\re3_icon.mif" - "!:\resource\apps\re3_icon.mif"
"..\gamefiles\data\PARTICLE.CFG" - "E:\data\gta3\data\PARTICLE.CFG"
"..\gamefiles\models\fonts_j.txd" - "E:\data\gta3\models\fonts_j.txd"
"..\gamefiles\models\fonts_p.txd" - "E:\data\gta3\models\fonts_p.txd"
"..\gamefiles\models\fonts_r.txd" - "E:\data\gta3\models\fonts_r.txd"
"..\gamefiles\TEXT\american.gxt" - "E:\data\gta3\TEXT\american.gxt"
"..\gamefiles\TEXT\english.gxt" - "E:\data\gta3\TEXT\english.gxt"
"..\gamefiles\TEXT\french.gxt" - "E:\data\gta3\TEXT\french.gxt"
"..\gamefiles\TEXT\german.gxt" - "E:\data\gta3\TEXT\german.gxt"
"..\gamefiles\TEXT\italian.gxt" - "E:\data\gta3\TEXT\italian.gxt"
"..\gamefiles\TEXT\JAPANESE.gxt" - "E:\data\gta3\TEXT\JAPANESE.gxt"
"..\gamefiles\TEXT\polish.gxt" - "E:\data\gta3\TEXT\polish.gxt"
"..\gamefiles\TEXT\spanish.gxt" - "E:\data\gta3\TEXT\spanish.gxt"
"$(EPOCROOT)\epoc32\data\z\resource\apps\re3_icon.mif" - "!:\resource\apps\re3_icon.mif"

View file

@ -1,8 +1,8 @@
#{"GTA III"},(0xe0d67647),1,0,1
#{"GTA III"},(0xe0d67647),1,0,0
[0x101F7961], 0, 0, 0, {"S60ProductID"} ; S60v3
[0x1028315F], 0, 0, 0, {"S60ProductID"} ; ^1
[0x20022E6D], 0, 0, 0, {"S60ProductID"} ; ^3
[0x101F7961], 0, 0, 0, {"S60ProductID"}
[0x1028315F], 0, 0, 0, {"S60ProductID"}
[0x20022E6D], 0, 0, 0, {"S60ProductID"}
%{"nnproject"}
:"nnproject"
@ -11,24 +11,12 @@ IF (NOT package(0x20009A80)) OR (NOT package(0x2002372A)) ; old or missing openc
"incompatible_openc.txt"-"", FT, FORCEABORT
ENDIF
IF exists("z:\system\install\Series60v5.2.sis") AND exists("z:\sys\bin\libGLESv2.dll") ; ^3
IF exists("z:\system\install\Series60v5.2.sis") AND exists("z:\sys\bin\libGLESv2.dll")
"$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\re3.exe"-"!:\sys\bin\re3.exe"
ELSE ; everything else
ELSE
"$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\re3_gles1.exe"-"!:\sys\bin\re3.exe"
ENDIF
;"$(EPOCROOT)epoc32\release\$(PLATFORM)\$(TARGET)\re3.exe"-"!:\sys\bin\re3.exe"
"$(EPOCROOT)\epoc32\data\z\private\10003a3f\import\apps\re3_reg.rsc" - "!:\private\10003a3f\import\apps\re3_reg.rsc"
"$(EPOCROOT)\epoc32\data\z\resource\apps\re3.rsc" - "!:\resource\apps\re3.rsc"
"$(EPOCROOT)\epoc32\data\z\resource\apps\re3_icon.mif" - "!:\resource\apps\re3_icon.mif"
"..\gamefiles\data\PARTICLE.CFG" - "E:\data\gta3\data\PARTICLE.CFG"
"..\gamefiles\models\fonts_j.txd" - "E:\data\gta3\models\fonts_j.txd"
"..\gamefiles\models\fonts_p.txd" - "E:\data\gta3\models\fonts_p.txd"
"..\gamefiles\models\fonts_r.txd" - "E:\data\gta3\models\fonts_r.txd"
"..\gamefiles\TEXT\american.gxt" - "E:\data\gta3\TEXT\american.gxt"
"..\gamefiles\TEXT\english.gxt" - "E:\data\gta3\TEXT\english.gxt"
"..\gamefiles\TEXT\french.gxt" - "E:\data\gta3\TEXT\french.gxt"
"..\gamefiles\TEXT\german.gxt" - "E:\data\gta3\TEXT\german.gxt"
"..\gamefiles\TEXT\italian.gxt" - "E:\data\gta3\TEXT\italian.gxt"
"..\gamefiles\TEXT\JAPANESE.gxt" - "E:\data\gta3\TEXT\JAPANESE.gxt"
"..\gamefiles\TEXT\polish.gxt" - "E:\data\gta3\TEXT\polish.gxt"
"..\gamefiles\TEXT\spanish.gxt" - "E:\data\gta3\TEXT\spanish.gxt"

View file

@ -3689,7 +3689,6 @@ const char* controllerTypesPaths[] = {
void
CMenuManager::LoadController(int8 type)
{
#ifdef BUTTON_ICONS
switch (type)
{
case CONTROLLER_DUALSHOCK2:
@ -3704,8 +3703,7 @@ CMenuManager::LoadController(int8 type)
CFont::LoadButtons("MODELS/X360BTNS.TXD");
break;
}
#endif
// Unload current textures
for (int i = FE_CONTROLLER; i <= FE_ARROWS4; i++)
m_aFrontEndSprites[i].Delete();
@ -5142,9 +5140,6 @@ CMenuManager::ProcessButtonPresses(void)
ControlsManager.MakeControllerActionsBlank();
ControlsManager.InitDefaultControlConfiguration();
ControlsManager.InitDefaultControlConfigMouse(MousePointerStateHelper.GetMouseSetUp());
#if defined __SYMBIAN32__
m_ControlMethod = CONTROL_CLASSIC;
#else
#if !defined RW_GL3 && !defined RW_GLES1
if (AllValidWinJoys.m_aJoys[JOYSTICK1].m_bInitialised) {
DIDEVCAPS devCaps;
@ -5152,6 +5147,8 @@ CMenuManager::ProcessButtonPresses(void)
PSGLOBAL(joy1)->GetCapabilities(&devCaps);
ControlsManager.InitDefaultControlConfigJoyPad(devCaps.dwButtons);
}
#elif defined __SYMBIAN32__
// TODO
#else
if (PSGLOBAL(joy1id) != -1 && glfwJoystickPresent(PSGLOBAL(joy1id))) {
int count;
@ -5160,7 +5157,6 @@ CMenuManager::ProcessButtonPresses(void)
}
#endif
m_ControlMethod = CONTROL_STANDARD;
#endif
#ifdef FIX_BUGS
MousePointerStateHelper.bInvertVertically = true;
TheCamera.m_fMouseAccelVertical = 0.003f;

View file

@ -16,8 +16,7 @@
#include "Renderer.h"
#if defined __ARMCC_VERSION && !defined _DEBUG
// fixes crash
#pragma O2
#pragma O2 // fixes crash
#endif
int32 CCullZones::NumCullZones;

View file

@ -342,7 +342,7 @@ enum Config {
#define ALT_DODO_CHEAT
#define REGISTER_START_BUTTON
#define BIND_VEHICLE_FIREWEAPON // Adds ability to rebind fire key for 'in vehicle' controls
//#define BUTTON_ICONS // use textures to show controller buttons
#define BUTTON_ICONS // use textures to show controller buttons
// Hud, frontend and radar
//#define PS2_HUD

View file

@ -1448,21 +1448,17 @@ RenderEffects(void)
CGlass::Render();
CWaterCannons::Render();
CSpecialFX::Render();
#ifdef RW_GLES1
CShadows::RenderStaticShadows();
CShadows::RenderStoredShadows();
CSkidmarks::Render();
CAntennas::Render();
CRubbish::Render();
CCoronas::Render();
#endif
// CShadows::RenderStaticShadows();
// CShadows::RenderStoredShadows();
// CSkidmarks::Render();
// CAntennas::Render();
// CRubbish::Render();
// CCoronas::Render();
CParticle::Render();
CPacManPickups::Render();
#ifdef RW_GLES1
CWeaponEffects::Render();
CPointLights::RenderFogEffect();
CMovingThings::Render();
#endif
// CWeaponEffects::Render();
// CPointLights::RenderFogEffect();
// CMovingThings::Render();
CRenderer::RenderFirstPersonVehicle();
POP_RENDERGROUP();
}

View file

@ -84,6 +84,9 @@ void tbEndTimer(Const char* name)
}
assert(n != 1500);
TimerBar.Timers[n].endTime = (float)CTimer::GetCurrentTimeInCycles() / (float)CTimer::GetCyclesPerFrame();
if (strcmp(name, "EndOfFrame")) {
endOfFrameTime = TimerBar.Timers[n].endTime - TimerBar.Timers[n].startTime;
}
}
float Diag_GetFPS()

View file

@ -80,12 +80,7 @@ void TransformPoints(CVuVector *out, int n, const CMatrix &mat, const RwV3d *in,
": : "r" (out) , "r" (n), "r" (&mat), "r" (in), "r" (stride): "memory");
#else
while(n--){
#ifdef S60V3
const RwV3d i = *in;
*out = mat * i;
#else
*out = mat * *in;
#endif
in = (RwV3d*)((uint8*)in + stride);
out++;
}
@ -115,12 +110,7 @@ void TransformPoints(CVuVector *out, int n, const CMatrix &mat, const CVuVector
": : "r" (out) , "r" (n), "r" (&mat) ,"r" (in): "memory");
#else
while(n--){
#ifdef S60V3
const RwV3d i = *in;
*out = mat * i;
#else
*out = mat * *in;
#endif
in++;
out++;
}

View file

@ -1,6 +1,5 @@
#if defined __ARMCC_VERSION && !defined _DEBUG
// fixes crash
#pragma O2
#pragma O2 // fixes crash
#endif
#include "common.h"

View file

@ -1355,25 +1355,19 @@ void CHud::DrawAfterFade()
CSprite2d::DrawRect(CRECT(320 + 20, 286 + y, 60, 20), CRGBA(0, 0, 0, 128));
PRINT("start", 320 + 20, 290 + y, 60);
// l3, r3
CSprite2d::DrawRect(CRECT(320 - 80, 254 + y, 60, 20), CRGBA(0, 0, 0, 128));
PRINT("L3", 320 - 80, 258 + y, 60);
CSprite2d::DrawRect(CRECT(320 + 20, 254 + y, 60, 20), CRGBA(0, 0, 0, 128));
PRINT("R3", 320 + 20, 258 + y, 60);
// dpad
CSprite2d::DrawRect(CRECT(0, 80 + y, w / 4, 120), CRGBA(0, 0, 0, 128));
PRINT("\"", w / 8 - 15, 90 + y, 30);
PRINT("/\\", w / 8 - 15, 90 + y, 30);
PRINT("v", w / 8 - 15, 160 + y, 30);
PRINT("<", w / 8 - 60, 125 + y, 30);
PRINT(">", w / 8 + 30, 125 + y, 30);
// abxy
CSprite2d::DrawRect(CRECT(w - w / 4, 80 + y, w / 4, 120), CRGBA(0, 0, 0, 128));
PRINT("\"", w - w / 8 - 15, 90 + y, 30);
PRINT("/\\", w - w / 8 - 15, 90 + y, 30);
PRINT("X", w - w / 8 - 15, 160 + y, 30);
PRINT("[]", w - w / 8 - 60, 125 + y, 30);
PRINT("|", w - w / 8 + 30, 125 + y, 30);
PRINT("O", w - w / 8 + 30, 125 + y, 30);
#undef PRINT
#undef CRECT
}

View file

@ -138,7 +138,7 @@ CSpecialFX::Render(void)
{
PUSH_RENDERGROUP("CSpecialFX::Render");
// CMotionBlurStreaks::Render();
CBulletTraces::Render();
// CBulletTraces::Render();
// CBrightLights::Render();
// CShinyTexts::Render();
CMoneyMessages::Render();

View file

@ -71,8 +71,6 @@ const TUid KUidRE3 = {0xe0d67647};
#define JOY_L2 6
#define JOY_R2 7
#define JOY_BACK 8
#define JOY_L3 9
#define JOY_R3 10
#define JOY_START 11
#define JOY_DPAD_UP 12
#define JOY_DPAD_RIGHT 13
@ -336,9 +334,6 @@ static int MapScanCode(TInt aScanCode, TInt aModifiers) {
case 'z':
case 'Z':
case '1':
case EStdKeyDevice3:
case EStdKeyEnter:
case EStdKeyNkpEnter:
return JOY_B;
case 'x':
case 'X':
@ -351,7 +346,6 @@ static int MapScanCode(TInt aScanCode, TInt aModifiers) {
case 's':
case 'S':
case '3':
case EStdKeyBackspace:
return JOY_Y;
case '5':
@ -362,10 +356,6 @@ static int MapScanCode(TInt aScanCode, TInt aModifiers) {
return JOY_L2;
case '8':
return JOY_R2;
case '9':
return JOY_L3;
case '0':
return JOY_R3;
case EStdKeyDevice0:
return JOY_BACK;
@ -420,6 +410,7 @@ public:
CMenuManager::m_bStartUpFrontEndRequested = true;
container->gGameState = GS_FRONTEND;
// container->gGameState = GS_INIT_PLAYING_GAME;
break;
case GS_FRONTEND:
if (!ForegroundApp) break;
@ -445,9 +436,10 @@ public:
TRACE("gGameState = GS_PLAYING_GAME;");
break;
case GS_PLAYING_GAME:
// float ms = (float)CTimer::GetCurrentTimeInCycles() / (float)CTimer::GetCyclesPerMillisecond();
if (RwInitialised && ForegroundApp) {
// if (!CMenuManager::m_PrefsFrameLimiter || (1000.0f / (float)RsGlobal.maxFPS) < ms)
if (!ForegroundApp) break;
float ms = (float)CTimer::GetCurrentTimeInCycles() / (float)CTimer::GetCyclesPerMillisecond();
if ( RwInitialised ) {
if (!CMenuManager::m_PrefsFrameLimiter || (1000.0f / (float)RsGlobal.maxFPS) < ms)
RsEventHandler(rsIDLE, (void *)TRUE);
}
break;
@ -515,13 +507,13 @@ public:
SetFocus(ETrue);
#ifndef S60V3
#ifdef RW_GL3
Window().EnableAdvancedPointers();
#endif
EnableDragEvents();
ActivateL();
#ifndef S60V3
#ifdef RW_GL3
// VC4 check
VersionInfo::TPlatformVersion platformVersion;
VersionInfo::GetVersion(platformVersion);
@ -618,13 +610,12 @@ public:
}
virtual void HandlePointerEventL(const TPointerEvent& aPointerEvent) {
touch = true;
int x = aPointerEvent.iPosition.iX;
int y = aPointerEvent.iPosition.iY;
int w = Size().iWidth;
int h = Size().iHeight;
if (h > 360) y = (y * 360) / 480;
if (h > 360) y += h - 360;
// if (FrontEndMenuManager.m_bMenuActive) {
// PSGLOBAL(lastMousePos).x = x;
@ -640,7 +631,7 @@ public:
// CCoeControl::HandlePointerEventL(aPointerEvent);
// return;
// }
#ifndef S60V3
#ifdef RW_GL3
const TAdvancedPointerEvent* advpointer = aPointerEvent.AdvancedPointerEvent();
int i = advpointer != NULL ? advpointer->PointerNumber() : 0;
#else
@ -685,7 +676,7 @@ public:
stickCenterX[i] = x;
stickCenterY[i] = y;
}
} else if (y > 280 && y < 280 + 32) {
} else if (y >= 280 && y <= 280 + 32) {
if (x > 320 - 80 && x < 320 - 20) {
// select
activeZone[i] = JOY_BACK + 1;
@ -695,14 +686,6 @@ public:
activeZone[i] = JOY_START + 1;
virtualButtons[JOY_START] = 1;
}
} else if (y > 280 - 32 && y < 280) {
if (x > 320 - 80 && x < 320 - 20) {
activeZone[i] = JOY_L3 + 1;
virtualButtons[JOY_L3] = 1;
} else if (x > 320 + 20 && x < 320 + 80) {
activeZone[i] = JOY_R3 + 1;
virtualButtons[JOY_R3] = 1;
}
} else if (y >= 80 && y <= 80 + 120) {
if (x < w / 4) {
// dpad
@ -780,7 +763,6 @@ public:
case EEventKeyUp: {
TInt k = MapScanCode(aEvent.Key()->iScanCode, aEvent.Key()->iModifiers);
if (k == -1) break;
touch = false;
virtualButtons[k] = aEvent.Type() == EEventKeyDown;
break;
}
@ -788,14 +770,6 @@ public:
break;
}
}
void HandleResourceChange(TInt aType) {
switch (aType) {
case KEikDynamicLayoutVariantSwitch:
SetExtentToWholeScreen();
break;
}
}
};
class RE3AppUi : public CAknAppUi {

View file

@ -137,9 +137,6 @@ slerp(const Quat &q, const Quat &p, float32 a)
c = -c;
q1 = negate(q1);
}
if(c > 1.0f) {
c = 1.0f;
}
float32 phi = acosf(c);
if(phi > 0.00001f){
float32 s = sinf(phi);
@ -550,7 +547,7 @@ Matrix::invertGeneral(Matrix *dst, const Matrix *src)
// get the determinant from that
det = src->up.x * dst->right.y + src->at.x * dst->right.z + dst->right.x * src->right.x;
invdet = 1.0;
if(fabsf(det) > 0.00001f)
if(det != 0.0f)
invdet = 1.0f/det;
dst->right.x *= invdet;
dst->right.y *= invdet;
@ -573,7 +570,7 @@ Matrix::makeRotation(Matrix *dst, const V3d *axis, float32 angle)
{
// V3d v = normalize(*axis);
float32 len = dot(*axis, *axis);
if(len > 0.00001f) len = 1.0f/sqrtf(len);
if(len != 0.0f) len = 1.0f/sqrtf(len);
V3d v = rw::scale(*axis, len);
angle = angle*(float)M_PI/180.0f;
float32 s = sinf(angle);

View file

@ -113,10 +113,18 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
glVertexAttribPointer(ATTRIB_POS, 4, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + 0);
glEnableVertexAttribArray(ATTRIB_COLOR);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, r));
#else
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, r));
#endif
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, u));
#else
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, u));
#endif
glDrawArrays(primTypeMap[primType], 0, numVertices);
@ -146,10 +154,18 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
glVertexAttribPointer(ATTRIB_POS, 4, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + 0);
glEnableVertexAttribArray(ATTRIB_COLOR);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, r));
#else
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, r));
#endif
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + OFFSET_OF(Im2DVertex, u));
#else
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im2DVertex), (uint8*)vertices + offsetof(Im2DVertex, u));
#endif
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
@ -216,10 +232,18 @@ im3DRenderPrimitive(PrimitiveType primType)
glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + 0);
glEnableVertexAttribArray(ATTRIB_COLOR);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, r));
#else
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, r));
#endif
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u));
#else
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, u));
#endif
glDrawArrays(primTypeMap[primType], 0, num3DVertices);
@ -240,10 +264,18 @@ im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndic
glVertexAttribPointer(ATTRIB_POS, 3, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + 0);
glEnableVertexAttribArray(ATTRIB_COLOR);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, r));
#else
glVertexAttribPointer(ATTRIB_COLOR, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, r));
#endif
glEnableVertexAttribArray(ATTRIB_TEXCOORDS0);
#ifdef __SYMBIAN32__
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u));
#else
glVertexAttribPointer(ATTRIB_TEXCOORDS0, 2, GL_FLOAT, GL_FALSE, sizeof(Im3DVertex), (uint8*)currentIm3dVertices + offsetof(Im3DVertex, u));
#endif
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);

View file

@ -17,6 +17,8 @@
namespace rw {
namespace gles1 {
uint32 im2DVbo, im2DIbo;
static int primTypeMap[] = {
GL_POINTS, // invalid
GL_LINES,
@ -30,11 +32,15 @@ static int primTypeMap[] = {
void
openIm2D(void)
{
glGenBuffers(1, &im2DIbo);
glGenBuffers(1, &im2DVbo);
}
void
closeIm2D(void)
{
glDeleteBuffers(1, &im2DIbo);
glDeleteBuffers(1, &im2DVbo);
}
static Im2DVertex tmpprimbuf[3];
@ -64,16 +70,15 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
Camera *cam;
cam = (Camera*)engine->currentCamera;
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(Im2DVertex), vertices, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), vertices);
glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), (void*)0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, r)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, r));
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, u)));
glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, u));
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@ -105,17 +110,18 @@ void im2DRenderIndexedPrimitive(PrimitiveType primType,
Camera *cam;
cam = (Camera*)engine->currentCamera;
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im2DIbo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*2, indices, GL_DYNAMIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, im2DVbo);
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(Im2DVertex), vertices, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), vertices);
glVertexPointer(3, GL_FLOAT, sizeof(Im2DVertex), (void*)0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, r)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, r));
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)((uint8*)vertices + OFFSET_OF(Im2DVertex, u)));
glTexCoordPointer(2, GL_FLOAT, sizeof(Im2DVertex), (void*)OFFSET_OF(Im2DVertex, u));
glMatrixMode(GL_PROJECTION);
glPushMatrix();
@ -127,7 +133,7 @@ void im2DRenderIndexedPrimitive(PrimitiveType primType,
glLoadIdentity();
flushCache();
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, nil);
glMatrixMode(GL_PROJECTION);
glPopMatrix();
@ -141,17 +147,30 @@ void im2DRenderIndexedPrimitive(PrimitiveType primType,
// Im3D
static int32 num3DVertices;
static AttribDesc im3dattribDesc[3] = {
{ ATTRIB_POS, GL_FLOAT, GL_FALSE, 3,
sizeof(Im3DVertex), 0 },
{ ATTRIB_COLOR, GL_UNSIGNED_BYTE, GL_TRUE, 4,
sizeof(Im3DVertex), OFFSET_OF(Im3DVertex, r) },
{ ATTRIB_TEXCOORDS0, GL_FLOAT, GL_FALSE, 2,
sizeof(Im3DVertex), OFFSET_OF(Im3DVertex, u) },
};
static uint32 im3DVbo, im3DIbo;
static int32 num3DVertices; // not actually needed here
static void* currentIm3dVertices;
void
openIm3D(void)
{
glGenBuffers(1, &im3DIbo);
glGenBuffers(1, &im3DVbo);
}
void
closeIm3D(void)
{
glDeleteBuffers(1, &im3DIbo);
glDeleteBuffers(1, &im3DVbo);
}
void
@ -167,23 +186,21 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world, uint32 flags)
if((flags & im3d::VERTEXUV) == 0)
SetRenderStatePtr(TEXTURERASTER, nil);
currentIm3dVertices = vertices;
glBindBuffer(GL_ARRAY_BUFFER, im3DVbo);
glBufferData(GL_ARRAY_BUFFER, numVertices*sizeof(Im3DVertex), vertices, GL_DYNAMIC_DRAW);
num3DVertices = numVertices;
}
void
im3DRenderPrimitive(PrimitiveType primType)
{
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, im3DVbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), currentIm3dVertices);
glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), (void*)0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, r)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, r));
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u)));
glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, u));
flushCache();
glDrawArrays(primTypeMap[primType], 0, num3DVertices);
@ -196,20 +213,19 @@ im3DRenderPrimitive(PrimitiveType primType)
void
im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices)
{
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*2, indices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, im3DVbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), currentIm3dVertices);
glVertexPointer(3, GL_FLOAT, sizeof(Im3DVertex), (void*)0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, r)));
glColorPointer(4, GL_UNSIGNED_BYTE, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, r));
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)((uint8*)currentIm3dVertices + OFFSET_OF(Im3DVertex, u)));
glTexCoordPointer(2, GL_FLOAT, sizeof(Im3DVertex), (void*)OFFSET_OF(Im3DVertex, u));
flushCache();
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, indices);
glDrawElements(primTypeMap[primType], numIndices, GL_UNSIGNED_SHORT, nil);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);

View file

@ -33,10 +33,6 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
InstanceData *inst = header->inst;
int32 n = header->numMeshes;
//test rapido a ver si es la textura
glDisableClientState(GL_COLOR_ARRAY);
glColor4f(1,1,1,1);
while(n--){
m = inst->material;
setMaterial(flags, m->color, m->surfaceProps);
@ -51,7 +47,6 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
// skinInstanceCB: igual que defaultInstanceCB, sin pesos/indices
// porque GLES1 no puede hacer skinning en GPU
// aunque... capaz podemos hacerloc on el PowerVR y las extensiones
void
skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance)
{

View file

@ -11,12 +11,14 @@
#ifdef __SYMBIAN32__
#undef stderr
#define stderr stdout
#endif
#ifdef OFFSET_OF
#undef OFFSET_OF
#endif
#define OFFSET_OF(type, member) ((size_t)&(((type*)0)->member))
#define OFFSET_OF(type, member) \
((size_t)((char*)&(((type*)0)->member) - (char*)0))
#endif
// TODO: clean up the opengl defines
// and figure out what we even want here...
@ -560,7 +562,7 @@ enum Platform
PLATFORM_WDGL = 11, // WarDrum OpenGL
PLATFORM_GL3 = 12, // my GL3 implementation
PLATFORM_GLES1 = 14,
PLATFORM_GLES1 = 13,
NUM_PLATFORMS,