mirror of
https://github.com/XProger/OpenLara.git
synced 2025-08-15 09:34:18 +02:00
3DS underwater color, some fixes for UI
This commit is contained in:
@@ -57,7 +57,7 @@ namespace GAPI {
|
|||||||
|
|
||||||
struct Shader {
|
struct Shader {
|
||||||
shaderProgram_s program;
|
shaderProgram_s program;
|
||||||
C3D_TexEnv env;
|
C3D_TexEnv env[2];
|
||||||
|
|
||||||
int32 uID[uMAX];
|
int32 uID[uMAX];
|
||||||
|
|
||||||
@@ -77,7 +77,14 @@ namespace GAPI {
|
|||||||
default : src = compose_dvlb;
|
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++) {
|
for (int ut = 0; ut < uMAX; ut++) {
|
||||||
uID[ut] = shaderInstanceGetUniformLocation(program.vertexShader, UniformName[ut]);
|
uID[ut] = shaderInstanceGetUniformLocation(program.vertexShader, UniformName[ut]);
|
||||||
@@ -85,11 +92,19 @@ namespace GAPI {
|
|||||||
|
|
||||||
rebind = true;
|
rebind = true;
|
||||||
|
|
||||||
C3D_TexEnvInit(&env);
|
C3D_TexEnvInit(&env[0]);
|
||||||
C3D_TexEnvSrc(&env, C3D_Both, GPU_TEXTURE0, GPU_PRIMARY_COLOR, GPU_PRIMARY_COLOR);
|
C3D_TexEnvInit(&env[1]);
|
||||||
C3D_TexEnvFunc(&env, C3D_Both, GPU_MODULATE);
|
|
||||||
|
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
|
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() {
|
void validate() {
|
||||||
if (rebind) {
|
if (rebind) {
|
||||||
C3D_BindProgram(&program);
|
C3D_BindProgram(&program);
|
||||||
C3D_SetTexEnv(0, &env);
|
C3D_SetTexEnv(0, &env[0]);
|
||||||
|
C3D_SetTexEnv(1, &env[1]);
|
||||||
rebind = false;
|
rebind = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -159,19 +159,39 @@ static const OptionItem optSound[] = {
|
|||||||
OptionItem( OptionItem::TYPE_PARAM, STR_OPT_LANGUAGE, SETTINGS( audio.language ), STR_LANG_EN, 0, 10 ),
|
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[] = {
|
static const OptionItem optControls[] = {
|
||||||
OptionItem( OptionItem::TYPE_TITLE, STR_SET_CONTROLS ),
|
OptionItem( OptionItem::TYPE_TITLE, STR_SET_CONTROLS ),
|
||||||
OptionItem( ),
|
OptionItem( ),
|
||||||
OptionItem( OptionItem::TYPE_PARAM, STR_EMPTY, SETTINGS( playerIndex ), STR_PLAYER_1, 0, 1 ),
|
#ifndef INV_SINGLE_PLAYER
|
||||||
#ifndef _OS_CLOVER
|
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 ),
|
OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_GAMEPAD , SETTINGS( controls[0].joyIndex ), STR_GAMEPAD_1, 0, 3 ),
|
||||||
#endif
|
#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 ),
|
OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_VIBRATION , SETTINGS( controls[0].vibration ), STR_OFF, 0, 1 ),
|
||||||
#endif
|
#endif
|
||||||
OptionItem( OptionItem::TYPE_PARAM, STR_OPT_CONTROLS_RETARGET , SETTINGS( controls[0].retarget ), STR_OFF, 0, 1 ),
|
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 ),
|
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 ),
|
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 + 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 + 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 ),
|
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 :
|
case TR::Entity::INV_SOUND :
|
||||||
optCount = COUNT(optSound);
|
optCount = COUNT(optSound);
|
||||||
return optSound;
|
return optSound;
|
||||||
case TR::Entity::INV_CONTROLS :
|
case TR::Entity::INV_CONTROLS : {
|
||||||
ASSERT(optControls[2].offset == SETTINGS( playerIndex) );
|
|
||||||
for (int i = 0; i < COUNT(optControls); i++) {
|
for (int i = 0; i < COUNT(optControls); i++) {
|
||||||
OptionItem &opt = optControlsPlayer[i];
|
OptionItem &opt = optControlsPlayer[i];
|
||||||
opt = optControls[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;
|
opt.offset += sizeof(Core::Settings::Controls) * Core::settings.playerIndex;
|
||||||
|
|
||||||
if (opt.type == OptionItem::TYPE_KEY) {
|
if (opt.type == OptionItem::TYPE_KEY) {
|
||||||
@@ -422,6 +441,7 @@ struct Inventory {
|
|||||||
}
|
}
|
||||||
optCount = COUNT(optControlsPlayer);
|
optCount = COUNT(optControlsPlayer);
|
||||||
return optControlsPlayer;
|
return optControlsPlayer;
|
||||||
|
}
|
||||||
default :
|
default :
|
||||||
optCount = 0;
|
optCount = 0;
|
||||||
return NULL;
|
return NULL;
|
||||||
@@ -967,7 +987,11 @@ struct Inventory {
|
|||||||
}
|
}
|
||||||
case TR::Entity::INV_CONTROLS :
|
case TR::Entity::INV_CONTROLS :
|
||||||
Core::settings.playerIndex = 0;
|
Core::settings.playerIndex = 0;
|
||||||
Core::settings.ctrlIndex = 0;
|
#ifdef INV_GAMEPAD_ONLY
|
||||||
|
Core::settings.ctrlIndex = 1;
|
||||||
|
#else
|
||||||
|
Core::settings.ctrlIndex = 0;
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case TR::Entity::INV_DETAIL :
|
case TR::Entity::INV_DETAIL :
|
||||||
settings = Core::settings;
|
settings = Core::settings;
|
||||||
@@ -1234,8 +1258,11 @@ struct Inventory {
|
|||||||
newKey = Input::lastKey;
|
newKey = Input::lastKey;
|
||||||
} else {
|
} else {
|
||||||
JoyKey jk = Input::joy[Core::settings.controls[Core::settings.playerIndex].joyIndex].lastKey;
|
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;
|
newKey = jk;
|
||||||
|
} else if (Input::lastKey != ikNone) {
|
||||||
|
waitForKey = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (newKey != -1) {
|
if (newKey != -1) {
|
||||||
|
33
src/mesh.h
33
src/mesh.h
@@ -1285,16 +1285,17 @@ struct MeshBuilder {
|
|||||||
int16 minY = int16(pos.y);
|
int16 minY = int16(pos.y);
|
||||||
int16 maxX = int16(size.x) + minX;
|
int16 maxX = int16(size.x) + minX;
|
||||||
int16 maxY = int16(size.y) + minY;
|
int16 maxY = int16(size.y) + minY;
|
||||||
|
int16 s = 1;
|
||||||
|
|
||||||
vertices[vCount + 0].coord = short4( minX, minY, 0, 1 );
|
vertices[vCount + 0].coord = short4( minX - s, minY - s, 0, 1 );
|
||||||
vertices[vCount + 1].coord = short4( maxX, minY, 0, 1 );
|
vertices[vCount + 1].coord = short4( maxX + s, minY - s, 0, 1 );
|
||||||
vertices[vCount + 2].coord = short4( maxX, int16(minY + 1), 0, 1 );
|
vertices[vCount + 2].coord = short4( maxX + s, minY + s, 0, 1 );
|
||||||
vertices[vCount + 3].coord = short4( minX, int16(minY + 1), 0, 1 );
|
vertices[vCount + 3].coord = short4( minX - s, minY + s, 0, 1 );
|
||||||
|
|
||||||
vertices[vCount + 4].coord = short4( minX, minY, 0, 1 );
|
vertices[vCount + 4].coord = short4( minX - s, minY - s, 0, 1 );
|
||||||
vertices[vCount + 5].coord = short4( int16(minX + 1), minY, 0, 1 );
|
vertices[vCount + 5].coord = short4( minX + s, minY - s, 0, 1 );
|
||||||
vertices[vCount + 6].coord = short4( int16(minX + 1), maxY, 0, 1 );
|
vertices[vCount + 6].coord = short4( minX + s, maxY + s, 0, 1 );
|
||||||
vertices[vCount + 7].coord = short4( minX, maxY, 0, 1 );
|
vertices[vCount + 7].coord = short4( minX - s, maxY + s, 0, 1 );
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
Vertex &v = vertices[vCount + 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;
|
||||||
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 + 0].coord = short4( minX + s, maxY - s, 0, 1 );
|
||||||
vertices[vCount + 1].coord = short4( maxX, int16(maxY - 1), 0, 1 );
|
vertices[vCount + 1].coord = short4( maxX + s, maxY - s, 0, 1 );
|
||||||
vertices[vCount + 2].coord = short4( maxX, maxY, 0, 1 );
|
vertices[vCount + 2].coord = short4( maxX + s, maxY + s, 0, 1 );
|
||||||
vertices[vCount + 3].coord = short4( minX, maxY, 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 + 4].coord = short4( maxX - s, minY + s, 0, 1 );
|
||||||
vertices[vCount + 5].coord = short4( maxX, minY, 0, 1 );
|
vertices[vCount + 5].coord = short4( maxX + s, minY + s, 0, 1 );
|
||||||
vertices[vCount + 6].coord = short4( maxX, maxY, 0, 1 );
|
vertices[vCount + 6].coord = short4( maxX + s, maxY + s, 0, 1 );
|
||||||
vertices[vCount + 7].coord = short4( int16(maxX - 1), maxY, 0, 1 );
|
vertices[vCount + 7].coord = short4( maxX - s, maxY + s, 0, 1 );
|
||||||
|
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < 8; i++) {
|
||||||
Vertex &v = vertices[vCount + i];
|
Vertex &v = vertices[vCount + i];
|
||||||
|
Reference in New Issue
Block a user