mirror of
https://github.com/mwpenny/portal64-still-alive.git
synced 2024-10-19 22:27:36 -04:00
Implemented very broken portal particle effect
Fixed portal hud indicator
This commit is contained in:
parent
cfb98555c5
commit
5aba1b3e77
1
Makefile
1
Makefile
|
@ -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
|
||||
|
|
|
@ -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
26
src/effects/effects.c
Normal 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
18
src/effects/effects.h
Normal 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
|
15
src/effects/fail_portal_splash.c
Normal file
15
src/effects/fail_portal_splash.c
Normal 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,
|
||||
};
|
8
src/effects/fail_portal_splash.h
Normal file
8
src/effects/fail_portal_splash.h
Normal 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
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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){
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue