From 71c974402f9c6db9dc144d2e9d5dc6cb94da33f3 Mon Sep 17 00:00:00 2001 From: XProger Date: Tue, 25 Jun 2019 03:49:55 +0300 Subject: [PATCH] 3DS underwater color, some fixes for UI --- src/gapi/c3d.h | 30 +++++++++++++++++++++++------- src/inventory.h | 45 ++++++++++++++++++++++++++++++++++++--------- src/mesh.h | 33 +++++++++++++++++---------------- 3 files changed, 76 insertions(+), 32 deletions(-) diff --git a/src/gapi/c3d.h b/src/gapi/c3d.h index 97f7820..b968d66 100644 --- a/src/gapi/c3d.h +++ b/src/gapi/c3d.h @@ -57,7 +57,7 @@ namespace GAPI { struct Shader { shaderProgram_s program; - C3D_TexEnv env; + C3D_TexEnv env[2]; int32 uID[uMAX]; @@ -77,7 +77,14 @@ namespace GAPI { default : src = compose_dvlb; } - shaderProgramSetVsh(&program, &src->DVLE[0]); + shaderProgramSetVsh(&program, &src->DVLE[0]); + + bool underwater = false; + for (int i = 0; i < defCount; i++) { + if (def[i] == SD_UNDERWATER) { + underwater = true; + } + } for (int ut = 0; ut < uMAX; ut++) { uID[ut] = shaderInstanceGetUniformLocation(program.vertexShader, UniformName[ut]); @@ -85,11 +92,19 @@ namespace GAPI { rebind = true; - C3D_TexEnvInit(&env); - C3D_TexEnvSrc(&env, C3D_Both, GPU_TEXTURE0, GPU_PRIMARY_COLOR, GPU_PRIMARY_COLOR); - C3D_TexEnvFunc(&env, C3D_Both, GPU_MODULATE); + C3D_TexEnvInit(&env[0]); + C3D_TexEnvInit(&env[1]); + + C3D_TexEnvSrc(&env[0], C3D_Both, GPU_TEXTURE0, GPU_PRIMARY_COLOR, GPU_PRIMARY_COLOR); + C3D_TexEnvFunc(&env[0], C3D_Both, GPU_MODULATE); if (Core::pass == Core::passCompose && type == 2) { // rooms - C3D_TexEnvScale(&env, C3D_RGB, GPU_TEVSCALE_2); + C3D_TexEnvScale(&env[0], C3D_RGB, GPU_TEVSCALE_2); + } + + if (underwater) { + C3D_TexEnvSrc(&env[1], C3D_Both, GPU_PREVIOUS, GPU_CONSTANT, GPU_PRIMARY_COLOR); + C3D_TexEnvFunc(&env[1], C3D_Both, GPU_MODULATE); + C3D_TexEnvColor(&env[1], 0xFFE5E599); // modulate by underwater color } } @@ -108,7 +123,8 @@ namespace GAPI { void validate() { if (rebind) { C3D_BindProgram(&program); - C3D_SetTexEnv(0, &env); + C3D_SetTexEnv(0, &env[0]); + C3D_SetTexEnv(1, &env[1]); rebind = false; } diff --git a/src/inventory.h b/src/inventory.h index 153f03f..b9e8339 100644 --- a/src/inventory.h +++ b/src/inventory.h @@ -159,19 +159,39 @@ static const OptionItem optSound[] = { OptionItem( OptionItem::TYPE_PARAM, STR_OPT_LANGUAGE, SETTINGS( audio.language ), STR_LANG_EN, 0, 10 ), }; +#if defined(_OS_CLOVER) || defined(_OS_PSC) + #define INV_GAMEPAD_ONLY +#endif + +#if defined(_OS_PSP) || defined(_OS_PSV) || defined(_OS_3DS) + #define INV_SINGLE_PLAYER + #define INV_GAMEPAD_ONLY + #define INV_CTRL_START_OPTION 1 +#else + #define INV_CTRL_START_OPTION 2 +#endif + +#if defined(_OS_WIN) || defined(_OS_LINUX) || defined(_OS_RPI) + #define INV_VIBRATION +#endif + static const OptionItem optControls[] = { OptionItem( OptionItem::TYPE_TITLE, STR_SET_CONTROLS ), OptionItem( ), - OptionItem( OptionItem::TYPE_PARAM, STR_EMPTY, SETTINGS( playerIndex ), STR_PLAYER_1, 0, 1 ), -#ifndef _OS_CLOVER - OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_GAMEPAD, SETTINGS( controls[0].joyIndex ), STR_GAMEPAD_1, 0, 3 ), +#ifndef INV_SINGLE_PLAYER + OptionItem( OptionItem::TYPE_PARAM, STR_EMPTY , SETTINGS( playerIndex ), STR_PLAYER_1, 0, 1 ), + OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_GAMEPAD , SETTINGS( controls[0].joyIndex ), STR_GAMEPAD_1, 0, 3 ), #endif -#if defined(_OS_WIN) || defined(_OS_LINUX) || defined(_OS_RPI) +#ifdef INV_VIBRATION OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_VIBRATION , SETTINGS( controls[0].vibration ), STR_OFF, 0, 1 ), #endif OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_RETARGET , SETTINGS( controls[0].retarget ), STR_OFF, 0, 1 ), OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_MULTIAIM , SETTINGS( controls[0].multiaim ), STR_OFF, 0, 1 ), +#ifdef INV_GAMEPAD_ONLY + OptionItem( OptionItem::TYPE_PARAM, STR_EMPTY , SETTINGS( playerIndex ), STR_OPT_CONTROLS_GAMEPAD, 0, 0 ), +#else OptionItem( OptionItem::TYPE_PARAM, STR_EMPTY , SETTINGS( ctrlIndex ), STR_OPT_CONTROLS_KEYBOARD, 0, 1 ), +#endif OptionItem( OptionItem::TYPE_KEY, STR_CTRL_FIRST + cUp , SETTINGS( controls[0].keys[ cUp ] ), STR_KEY_FIRST ), OptionItem( OptionItem::TYPE_KEY, STR_CTRL_FIRST + cDown , SETTINGS( controls[0].keys[ cDown ] ), STR_KEY_FIRST ), OptionItem( OptionItem::TYPE_KEY, STR_CTRL_FIRST + cRight , SETTINGS( controls[0].keys[ cRight ] ), STR_KEY_FIRST ), @@ -403,13 +423,12 @@ struct Inventory { case TR::Entity::INV_SOUND : optCount = COUNT(optSound); return optSound; - case TR::Entity::INV_CONTROLS : - ASSERT(optControls[2].offset == SETTINGS( playerIndex) ); + case TR::Entity::INV_CONTROLS : { for (int i = 0; i < COUNT(optControls); i++) { OptionItem &opt = optControlsPlayer[i]; opt = optControls[i]; - if (i > 2 && opt.offset != SETTINGS( playerIndex ) && opt.offset != SETTINGS( ctrlIndex ) ) + if (i > INV_CTRL_START_OPTION && opt.offset != SETTINGS( playerIndex ) && opt.offset != SETTINGS( ctrlIndex ) ) opt.offset += sizeof(Core::Settings::Controls) * Core::settings.playerIndex; if (opt.type == OptionItem::TYPE_KEY) { @@ -422,6 +441,7 @@ struct Inventory { } optCount = COUNT(optControlsPlayer); return optControlsPlayer; + } default : optCount = 0; return NULL; @@ -967,7 +987,11 @@ struct Inventory { } case TR::Entity::INV_CONTROLS : Core::settings.playerIndex = 0; - Core::settings.ctrlIndex = 0; + #ifdef INV_GAMEPAD_ONLY + Core::settings.ctrlIndex = 1; + #else + Core::settings.ctrlIndex = 0; + #endif break; case TR::Entity::INV_DETAIL : settings = Core::settings; @@ -1234,8 +1258,11 @@ struct Inventory { newKey = Input::lastKey; } else { JoyKey jk = Input::joy[Core::settings.controls[Core::settings.playerIndex].joyIndex].lastKey; - if (Core::settings.ctrlIndex == 1 && jk != jkNone) + if (Core::settings.ctrlIndex == 1 && jk != jkNone) { newKey = jk; + } else if (Input::lastKey != ikNone) { + waitForKey = NULL; + } } if (newKey != -1) { diff --git a/src/mesh.h b/src/mesh.h index b8b0cba..d0012f7 100644 --- a/src/mesh.h +++ b/src/mesh.h @@ -1285,16 +1285,17 @@ struct MeshBuilder { int16 minY = int16(pos.y); int16 maxX = int16(size.x) + minX; int16 maxY = int16(size.y) + minY; + int16 s = 1; - vertices[vCount + 0].coord = short4( minX, minY, 0, 1 ); - vertices[vCount + 1].coord = short4( maxX, minY, 0, 1 ); - vertices[vCount + 2].coord = short4( maxX, int16(minY + 1), 0, 1 ); - vertices[vCount + 3].coord = short4( minX, int16(minY + 1), 0, 1 ); + vertices[vCount + 0].coord = short4( minX - s, minY - s, 0, 1 ); + vertices[vCount + 1].coord = short4( maxX + s, minY - s, 0, 1 ); + vertices[vCount + 2].coord = short4( maxX + s, minY + s, 0, 1 ); + vertices[vCount + 3].coord = short4( minX - s, minY + s, 0, 1 ); - vertices[vCount + 4].coord = short4( minX, minY, 0, 1 ); - vertices[vCount + 5].coord = short4( int16(minX + 1), minY, 0, 1 ); - vertices[vCount + 6].coord = short4( int16(minX + 1), maxY, 0, 1 ); - vertices[vCount + 7].coord = short4( minX, maxY, 0, 1 ); + vertices[vCount + 4].coord = short4( minX - s, minY - s, 0, 1 ); + vertices[vCount + 5].coord = short4( minX + s, minY - s, 0, 1 ); + vertices[vCount + 6].coord = short4( minX + s, maxY + s, 0, 1 ); + vertices[vCount + 7].coord = short4( minX - s, maxY + s, 0, 1 ); for (int i = 0; i < 8; i++) { Vertex &v = vertices[vCount + i]; @@ -1306,15 +1307,15 @@ struct MeshBuilder { addQuad(indices, iCount, vCount, 0, vertices, NULL, false, false); vCount += 4; addQuad(indices, iCount, vCount, 0, vertices, NULL, false, false); vCount += 4; - vertices[vCount + 0].coord = short4( minX, int16(maxY - 1), 0, 1 ); - vertices[vCount + 1].coord = short4( maxX, int16(maxY - 1), 0, 1 ); - vertices[vCount + 2].coord = short4( maxX, maxY, 0, 1 ); - vertices[vCount + 3].coord = short4( minX, maxY, 0, 1 ); + vertices[vCount + 0].coord = short4( minX + s, maxY - s, 0, 1 ); + vertices[vCount + 1].coord = short4( maxX + s, maxY - s, 0, 1 ); + vertices[vCount + 2].coord = short4( maxX + s, maxY + s, 0, 1 ); + vertices[vCount + 3].coord = short4( minX + s, maxY + s, 0, 1 ); - vertices[vCount + 4].coord = short4( int16(maxX - 1), minY, 0, 1 ); - vertices[vCount + 5].coord = short4( maxX, minY, 0, 1 ); - vertices[vCount + 6].coord = short4( maxX, maxY, 0, 1 ); - vertices[vCount + 7].coord = short4( int16(maxX - 1), maxY, 0, 1 ); + vertices[vCount + 4].coord = short4( maxX - s, minY + s, 0, 1 ); + vertices[vCount + 5].coord = short4( maxX + s, minY + s, 0, 1 ); + vertices[vCount + 6].coord = short4( maxX + s, maxY + s, 0, 1 ); + vertices[vCount + 7].coord = short4( maxX - s, maxY + s, 0, 1 ); for (int i = 0; i < 8; i++) { Vertex &v = vertices[vCount + i];