Implemented very broken portal particle effect

Fixed portal hud indicator
This commit is contained in:
James Lambert 2023-09-12 22:21:52 -06:00
parent cfb98555c5
commit 5aba1b3e77
9 changed files with 117 additions and 16 deletions

View file

@ -248,6 +248,7 @@ build/assets/models/player/chell.h: assets/materials/chell.skm.yaml
build/assets/models/props/combine_ball_catcher.h: assets/materials/ball_catcher.skm.yaml
build/assets/models/props/combine_ball_launcher.h: assets/materials/ball_catcher.skm.yaml
build/src/decor/decor_object_list.o: build/assets/models/dynamic_model_list.h build/assets/materials/static.h
build/src/effects/fail_portal_splash.o: build/assets/materials/static.h
build/src/menu/controls.o: build/assets/materials/ui.h build/src/audio/clips.h
build/src/menu/game_menu.o: build/src/audio/clips.h build/assets/materials/ui.h build/assets/materials/images.h build/assets/test_chambers/test_chamber_00/test_chamber_00.h
build/src/menu/joystick_options.o: build/assets/materials/ui.h build/src/audio/clips.h

View file

@ -1055,4 +1055,22 @@ materials:
gDPSetRenderMode: G_RM_RA_ZB_OPA_DECAL
gSPGeometryMode:
clear: [G_LIGHTING, G_SHADE]
clear: [G_LIGHTING, G_SHADE]
portal_1_particle:
gDPSetTile:
filename: ../../portal_pak_modified/materials/effects/portal_1_particle.png
fmt: G_IM_FMT_RGBA
siz: G_IM_SIZ_32b
s:
shift: 1
t:
shift: 1
gDPSetRenderMode: G_RM_ZB_XLU_SURF
gDPSetCombineMode:
color: ["0", "0", "0", "TEXEL0"]
alpha: ["0", "0", "0", "TEXEL0"]
gSPGeometryMode:
clear: [G_CULL_BACK, G_CULL_FRONT]

26
src/effects/effects.c Normal file
View file

@ -0,0 +1,26 @@
#include "effects.h"
void effectsInit(struct Effects* effects) {
for (int i = 0; i < MAX_ACTIVE_SPLASH_EFFECTS; ++i) {
splashParticleEffectInit(&effects->splashParticleEffects[i]);
}
effects->nextSplashEffect = 0;
}
void effectsUpdate(struct Effects* effects) {
for (int i = 0; i < MAX_ACTIVE_SPLASH_EFFECTS; ++i) {
splashParticleEffectUpdate(&effects->splashParticleEffects[i]);
}
}
void effectsSplashPlay(struct Effects* effects, struct SplashParticleDefinition* definition, struct Vector3* origin, struct Vector3* normal) {
splashParticleEffectPlay(&effects->splashParticleEffects[effects->nextSplashEffect], definition, origin, normal);
++effects->nextSplashEffect;
if (effects->nextSplashEffect == MAX_ACTIVE_SPLASH_EFFECTS) {
effects->nextSplashEffect = 0;
}
}

18
src/effects/effects.h Normal file
View file

@ -0,0 +1,18 @@
#ifndef __EFFECTS_EFFECTS_H__
#define __EFFECTS_EFFECTS_H__
#include "splash_particle_effect.h"
#define MAX_ACTIVE_SPLASH_EFFECTS 3
struct Effects {
struct SplashParticleEffect splashParticleEffects[MAX_ACTIVE_SPLASH_EFFECTS];
short nextSplashEffect;
};
void effectsInit(struct Effects* effects);
void effectsUpdate(struct Effects* effects);
void effectsSplashPlay(struct Effects* effects, struct SplashParticleDefinition* definition, struct Vector3* origin, struct Vector3* normal);
#endif

View file

@ -0,0 +1,15 @@
#include "fail_portal_splash.h"
#include "../build/assets/materials/static.h"
struct SplashParticleDefinition gFailPortalSplash = {
.particleLifetime = 1.0f,
.particleTailDelay = 0.1f,
.minNormalVelocity = 2.0f,
.maxNormalVelocity = 3.0f,
.minTangentVelocity = 3.0f,
.maxTangentVelocity = 4.0f,
.particleCount = 15,
.materialIndex = PORTAL_1_PARTICLE_INDEX,
.particleHalfWidth = 0.05f,
};

View file

@ -0,0 +1,8 @@
#ifndef __FAIL_PORTAL_SPLASH_H__
#define __FAIL_PORTAL_SPLASH_H__
#include "splash_particle_effect.h"
extern struct SplashParticleDefinition gFailPortalSplash;
#endif

View file

@ -106,21 +106,19 @@ void splashParticleEffectPlay(struct SplashParticleEffect* effect, struct Splash
for (int i = 0; i < effect->def->particleCount; ++i) {
struct SplashParticle* particle = &effect->particles[i];
struct Vector3 initialVelocity;
struct Vector2 tangentDir;
vector2RandomUnitCircle(&tangentDir);
float tangentMag = randomInRangef(definiton->minTangentVelocity, definiton->maxTangentVelocity);
float normalMag = randomInRangef(definiton->minNormalVelocity, definiton->maxNormalVelocity);
vector3Scale(normal, &initialVelocity, normalMag);
vector3AddScaled(&initialVelocity, &right, tangentDir.x * tangentMag, &initialVelocity);
vector3AddScaled(&initialVelocity, &up, tangentDir.y * tangentMag, &initialVelocity);
vector3Scale(normal, &particle->velocity, normalMag);
vector3AddScaled(&particle->velocity, &right, tangentDir.x * tangentMag, &particle->velocity);
vector3AddScaled(&particle->velocity, &up, tangentDir.y * tangentMag, &particle->velocity);
particle->position[1] = *origin;
vector3AddScaled(origin, &initialVelocity, definiton->particleTailDelay, &particle->position[0]);
vector3AddScaled(origin, &particle->velocity, definiton->particleTailDelay, &particle->position[0]);
vector3Cross(&initialVelocity, &gUp, &particle->widthOffset);
vector3Cross(&particle->velocity, &gUp, &particle->widthOffset);
float widthMag = vector3MagSqrd(&particle->widthOffset);

View file

@ -30,6 +30,7 @@
#include "signals.h"
#include "render_plan.h"
#include "../menu/game_menu.h"
#include "../effects/fail_portal_splash.h"
extern struct GameMenu gGameMenu;
@ -249,6 +250,8 @@ void sceneInitNoPauseMenu(struct Scene* scene, int mainMenuMode) {
scene->freeCameraOffset = gZeroVec;
effectsInit(&scene->effects);
sceneInitDynamicColliders(scene);
sceneAnimatorInit(&scene->animator, gCurrentLevel->animations, gCurrentLevel->animationInfoCount);
@ -558,6 +561,8 @@ void sceneUpdate(struct Scene* scene) {
soundPlayerPause();
}
effectsUpdate(&scene->effects);
signalsReset();
if (sceneAnimatorIsRunning(&scene->animator, gCurrentLevel->playerAnimatorIndex)) {
@ -861,7 +866,7 @@ int sceneDetermineSurfaceMapping(struct Scene* scene, struct CollisionObject* hi
if (quadIndex != -1) {
*mappingRangeOut = gCurrentLevel->portalSurfaceMappingRange[quadIndex];
*relativeToOut = NO_TRANSFORM_INDEX;
return 1;
return mappingRangeOut->minPortalIndex != mappingRangeOut->maxPortalIndex;
}
int dynamicBoxIndex = sceneDynamicBoxIndex(scene, hitObject);
@ -886,6 +891,9 @@ int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* player
int relativeIndex = NO_TRANSFORM_INDEX;
if (!sceneDetermineSurfaceMapping(scene, hit.object, &mappingRange, &relativeIndex)) {
if (!just_checking) {
effectsSplashPlay(&scene->effects, &gFailPortalSplash, &hit.at, &hit.normal);
}
return 0;
}
@ -913,13 +921,20 @@ int sceneFirePortal(struct Scene* scene, struct Ray* ray, struct Vector3* player
quatLook(&hitDirection, &upDir, &portalLocation.rotation);
}
if (!sceneOpenPortal(scene, &portalLocation, relativeIndex, portalIndex, mappingRange, hit.object, hit.roomIndex, fromPlayer, just_checking) && !fromPlayer){
sceneClosePortal(scene, 1-portalIndex);
scene->continuouslyAttemptingPortalOpen = 1;
scene->savedPortal.portalIndex = portalIndex;
scene->savedPortal.ray = *ray;
scene->savedPortal.roomIndex = roomIndex;
scene->savedPortal.transformUp = *playerUp;
if (!sceneOpenPortal(scene, &portalLocation, relativeIndex, portalIndex, mappingRange, hit.object, hit.roomIndex, fromPlayer, just_checking)) {
if (!fromPlayer) {
sceneClosePortal(scene, 1-portalIndex);
scene->continuouslyAttemptingPortalOpen = 1;
scene->savedPortal.portalIndex = portalIndex;
scene->savedPortal.ray = *ray;
scene->savedPortal.roomIndex = roomIndex;
scene->savedPortal.transformUp = *playerUp;
}
if (!just_checking) {
effectsSplashPlay(&scene->effects, &gFailPortalSplash, &hit.at, &hit.normal);
}
return 0;
}
if (!fromPlayer){

View file

@ -24,6 +24,7 @@
#include "clock.h"
#include "security_camera.h"
#include "trigger_listener.h"
#include "../effects/effects.h"
struct SavedPortal {
struct Ray ray;
@ -61,6 +62,7 @@ struct Scene {
struct Clock* clocks;
struct SecurityCamera* securityCameras;
struct SavedPortal savedPortal;
struct Effects effects;
OSTime cpuTime;
OSTime lastFrameStart;
OSTime lastFrameTime;