Implement triple sign state

This commit is contained in:
James Lambert 2023-11-24 21:54:27 -07:00
parent b8304fc8f4
commit 20e9beaa0f
7 changed files with 89 additions and 82 deletions

View file

@ -254,7 +254,6 @@ MODEL_LIST = assets/models/player/chell.blend \
assets/models/props/round_elevator_interior.blend \
assets/models/props/round_elevator_collision.blend \
assets/models/props/signage.blend \
assets/models/props/signage_off.blend \
assets/models/portal/portal_blue.blend \
assets/models/portal/portal_blue_filled.blend \
assets/models/portal/portal_blue_face.blend \

View file

@ -1 +0,0 @@
-alpha remove -crop 50x50+21+20 -resize 16x16

View file

@ -555,14 +555,16 @@ materials:
newsignage_back00:
gDPSetTile:
filename: ../../portal_pak_modified/materials/models/props_animsigns/newsignage_back00.png
siz: G_IM_SIZ_4b
twoTone: true
siz: G_IM_SIZ_8b
fmt: G_IM_FMT_I
s:
wrap: false
t:
wrap: false
gDPSetRenderMode: G_RM_ZB_OPA_SURF
gDPSetCombineMode:
color: ["TEXEL0", "0", "PRIMITIVE", "0"]
gSPGeometryMode:
clear: [G_LIGHTING]
@ -571,14 +573,15 @@ materials:
newsignage_back02:
gDPSetTile:
filename: ../../portal_pak_modified/materials/models/props_animsigns/newsignage_back02.png
siz: G_IM_SIZ_4b
twoTone: true
siz: G_IM_SIZ_8b
fmt: G_IM_FMT_I
s:
wrap: false
t:
wrap: false
gDPSetRenderMode: G_RM_ZB_OPA_SURF
gDPSetCombineMode:
color: ["TEXEL0", "0", "PRIMITIVE_ALPHA", "0"]
gSPGeometryMode:
clear: [G_LIGHTING]
@ -597,10 +600,12 @@ materials:
set: [G_SHADE]
gDPSetCombineMode:
color: [SHADE, PRIMITIVE, TEXEL0, PRIMITIVE]
gDPSetPrimColor:
r: 242
g: 245
b: 247
gDPSetCycleType: G_CYC_1CYCLE
signage_dark_lcd:
gDPSetRenderMode: G_RM_ZB_OPA_DECAL
gDPSetCombineMode:
color: ["0", "0", "0", ENVIRONMENT]
gDPSetCycleType: G_CYC_1CYCLE
awe_total_copy_0:
@ -608,18 +613,17 @@ materials:
filename: ../../portal_pak_modified/materials/models/props_animsigns/awe_total_copy_0.png
siz: G_IM_SIZ_4b
fmt: G_IM_FMT_I
s:
wrap: false
t:
wrap: false
gDPSetRenderMode: G_RM_ZB_OPA_DECAL
gSPGeometryMode:
clear: [G_LIGHTING]
set: [G_SHADE]
gDPSetCombineMode:
color: [SHADE, PRIMITIVE, TEXEL0, PRIMITIVE]
gDPSetPrimColor:
r: 242
g: 245
b: 247
color: ["ENVIRONMENT", PRIMITIVE, TEXEL0, PRIMITIVE]
gDPSetCycleType: G_CYC_1CYCLE
awe_total_copy_1:
@ -632,13 +636,8 @@ materials:
gSPGeometryMode:
clear: [G_LIGHTING]
set: [G_SHADE]
gDPSetCombineMode:
color: [SHADE, PRIMITIVE, TEXEL0, PRIMITIVE]
gDPSetPrimColor:
r: 242
g: 245
b: 247
color: ["ENVIRONMENT", PRIMITIVE, TEXEL0, PRIMITIVE]
gDPSetCycleType: G_CYC_1CYCLE
awe_total_copy_2:
@ -654,10 +653,6 @@ materials:
set: [G_SHADE]
gDPSetCombineMode:
color: [SHADE, PRIMITIVE, TEXEL0, PRIMITIVE]
gDPSetPrimColor:
r: 242
g: 245
b: 247
gDPSetCycleType: G_CYC_1CYCLE
vertex_color:

Binary file not shown.

View file

@ -1 +0,0 @@
-r 90,0,0 -m assets/materials/static.skm.yaml -m assets/materials/elevator.skm.yaml --default-material default --boneless

View file

@ -4,16 +4,23 @@
#include "../levels/levels.h"
#include "../defs.h"
#include "../graphics/color.h"
#include "../util/time.h"
#include "../build/assets/models/props/signage.h"
#include "../build/assets/models/props/signage_off.h"
#include "../build/assets/models/props/cylinder_test.h"
#include "../../build/assets/materials/static.h"
#include <stdlib.h>
int gCurrentSignageIndex = -1;
short gCurrentSignageIndex = -1;
short gCurrentSignageOn = 0;
enum SignState {
SignStateOff,
SignStateUnlit,
SignStateLit,
};
void signageSetLargeDigit(Vtx* vertices, int nextDigit, int currentDigit) {
int uOffset = (nextDigit - currentDigit) * (14 << 5);
@ -80,25 +87,35 @@ short gLevelWarnings[] = {
};
static struct Coloru8 gSignageOnColor = {0, 0, 0, 255};
static struct Coloru8 gSignageOffColor = {212, 212, 212, 255};
static struct Coloru8 gSignageDisabledColor = {212, 212, 212, 255};
static struct Coloru8 gSignageDisabledUnlitColor = {40, 40, 40, 255};
static struct Coloru8 gSignageOffColor = {46, 47, 49, 255};
void signageSetWarnings(int warningMask) {
void signageSetWarnings(int warningMask, enum SignState signState) {
for (int i = 0; i < 10; ++i) {
struct Coloru8 useColor = ((1 << i) & warningMask) ? gSignageOnColor : gSignageOffColor;
struct Coloru8 useColor;
if (signState == SignStateOff) {
useColor = gSignageOffColor;
} else if ((1 << i) & warningMask) {
useColor = gSignageOnColor;
} else if (signState == SignStateUnlit) {
useColor = gSignageDisabledUnlitColor;
} else {
useColor = gSignageDisabledColor;
}
for (int vIndex = 0; vIndex < 4; ++vIndex) {
((Vtx*)K0_TO_K1(gWarningVertices[i]))[vIndex].v.cn[0] = useColor.r;
((Vtx*)K0_TO_K1(gWarningVertices[i]))[vIndex].v.cn[1] = useColor.g;
((Vtx*)K0_TO_K1(gWarningVertices[i]))[vIndex].v.cn[2] = useColor.b;
((Vtx*)K0_TO_K1(gWarningVertices[i]))[vIndex].v.cn[3] = useColor.a;
}
}
}
void signageCheckIndex(int neededIndex) {
if (gCurrentSignageIndex == neededIndex) {
void signageCheckIndex(int neededIndex, enum SignState signState) {
if (gCurrentSignageIndex == neededIndex && gCurrentSignageOn == signState) {
return;
}
@ -113,22 +130,21 @@ void signageCheckIndex(int neededIndex) {
int oneDigit = neededIndex - tenDigit * 10;
gCurrentSignageIndex = neededIndex;
gCurrentSignageOn = signState;
signageSetLargeDigit(props_signage_signage_num00_digit_0_color, oneDigit, prevOneDigit);
signageSetLargeDigit(props_signage_signage_num00_digit_10_color, tenDigit, prevTenDigit);
signageSetSmallDigit(props_signage_signage_num00_sdigit_0_color, oneDigit, prevOneDigit);
signageSetSmallDigit(props_signage_signage_num00_sdigit_10_color, tenDigit, prevTenDigit);
signageSetWarnings(gLevelWarnings[neededIndex]);
signageSetWarnings(gLevelWarnings[neededIndex], signState);
}
void signageRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState) {
struct Signage* signage = (struct Signage*)data;
float n = ((float)rand()/RAND_MAX)*(float)(1.0);
int signOn = 1;
if (n <= signage->flickerChance){signOn = 0;}
if (signage->flickerChance > 0.0001){signage->flickerChance = signage->flickerChance*0.97;}
if (signOn){signageCheckIndex(signage->testChamberNumber);}
int signOn = ((int)gTimePassed) % 3;
signageCheckIndex(signage->testChamberNumber, signOn);
Mtx* matrix = renderStateRequestMatrices(renderState, 1);
@ -136,32 +152,31 @@ void signageRender(void* data, struct DynamicRenderDataList* renderList, struct
return;
}
Gfx* model = renderStateAllocateDLChunk(renderState, 4);
Gfx* dl = model;
if (signOn == SignStateOff) {
gDPSetPrimColor(dl++, 255, 255, 46, 47, 49, 49);
gDPSetEnvColor(dl++, 46, 47, 49, 255);
} else if (signOn == SignStateUnlit) {
gDPSetPrimColor(dl++, 255, 255, 46, 47, 49, 49);
gDPSetEnvColor(dl++, 0, 0, 0, 255);
} else {
gDPSetPrimColor(dl++, 255, 255, 242, 245, 247, 255);
gDPSetEnvColor(dl++, 0, 0, 0, 255);
}
gSPDisplayList(dl++, props_signage_model_gfx);
gSPEndDisplayList(dl++);
transformToMatrixL(&signage->transform, matrix, SCENE_SCALE);
if (signOn){
dynamicRenderListAddData(
renderList,
props_signage_model_gfx,
model,
matrix,
DEFAULT_INDEX,
&signage->transform.position,
NULL
);
}
else{
dynamicRenderListAddData(
renderList,
props_signage_off_model_gfx,
matrix,
DEFAULT_INDEX,
&signage->transform.position,
NULL
);
}
}
void signageInit(struct Signage* signage, struct SignageDefinition* definition) {