1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-14 00:54:05 +02:00

3DS underwater color, some fixes for UI

This commit is contained in:
XProger
2019-06-25 03:49:55 +03:00
parent 61dbdf3cd6
commit 71c974402f
3 changed files with 76 additions and 32 deletions

View File

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

View File

@@ -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) {

View File

@@ -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];