diff --git a/assets/materials/models/weapons/v_models/v_portalgun/v_portalgun.ims b/assets/materials/models/weapons/v_models/v_portalgun/v_portalgun.ims new file mode 100644 index 0000000..f9c0b00 --- /dev/null +++ b/assets/materials/models/weapons/v_models/v_portalgun/v_portalgun.ims @@ -0,0 +1 @@ +-crop 64x32+141+277 -resize 32x16 \ No newline at end of file diff --git a/assets/materials/objects.skm.yaml b/assets/materials/objects.skm.yaml index db7a104..535deaf 100644 --- a/assets/materials/objects.skm.yaml +++ b/assets/materials/objects.skm.yaml @@ -6,11 +6,31 @@ materials: b: 255 gSPGeometryMode: set: [G_LIGHTING, G_SHADE, G_CULL_BACK] + clear: [G_ZBUFFER] gDPSetCombineMode: color: ["PRIMITIVE", "0", "SHADE", "0"] gDPSetRenderMode: G_RM_OPA_SURF gDPSetCycleType: G_CYC_1CYCLE + portal_gun_flare: + gDPSetTile: + filename: ../../portal_pak_modified/materials/sprites/grav_flare.png + fmt: G_IM_FMT_RGBA + siz: G_IM_SIZ_32b + s: + mirror: true + t: + mirror: true + tmem: 256 + + gDPSetRenderMode: G_RM_XLU_SURF + gDPSetCycleType: G_CYC_1CYCLE + + gDPSetCombineMode: + color: ["TEXEL0", "0", "ENVIRONMENT", "0"] + alpha: ["0", "0", "0", "TEXEL0"] + gSPGeometryMode: + clear: [G_CULL_BACK, G_CULL_FRONT, G_TEXTURE_GEN, G_SHADE, G_LIGHTING] portal_gun_metal: gDPSetTile: @@ -23,6 +43,7 @@ materials: gSPGeometryMode: set: [G_LIGHTING, G_TEXTURE_GEN, G_SHADE, G_CULL_BACK] + clear: [G_ZBUFFER] gDPSetCombineMode: - color: ["PRIMITIVE", "0", "SHADE", "0"] @@ -58,7 +79,7 @@ materials: gSPGeometryMode: set: [G_LIGHTING, G_TEXTURE_GEN, G_SHADE] - clear: [G_CULL_BACK] + clear: [G_CULL_BACK, G_ZBUFFER] gDPSetCombineMode: color: ["PRIMITIVE", "0", "SHADE", "TEXEL0"] @@ -67,6 +88,23 @@ materials: gDPSetRenderMode: G_RM_XLU_SURF gDPSetCycleType: G_CYC_1CYCLE + portal_gun_shell: + gDPSetTile: + filename: ../../portal_pak_modified/materials/models/weapons/v_models/v_portalgun/v_portalgun.png + fmt: G_IM_FMT_RGBA + siz: G_IM_SIZ_16b + s: + wrap: false + t: + wrap: false + gSPGeometryMode: + set: [G_LIGHTING, G_SHADE, G_CULL_BACK] + clear: [G_TEXTURE_GEN, G_ZBUFFER] + gDPSetCombineMode: + color: ["SHADE", "0", "TEXEL0", "0"] + + gDPSetRenderMode: G_RM_OPA_SURF + button_base: gDPSetTile: - null diff --git a/assets/models/portal_gun/v_portalgun.blend b/assets/models/portal_gun/v_portalgun.blend index 598aade..60cf7c1 100644 Binary files a/assets/models/portal_gun/v_portalgun.blend and b/assets/models/portal_gun/v_portalgun.blend differ diff --git a/src/scene/portal_gun.c b/src/scene/portal_gun.c index dc1de5f..8d4d5f0 100644 --- a/src/scene/portal_gun.c +++ b/src/scene/portal_gun.c @@ -18,9 +18,9 @@ #define PORTAL_GUN_MOI 0.00395833375f -struct Vector3 gPortalGunOffset = {0.120957, -0.113587, -0.20916}; +struct Vector3 gPortalGunOffset = {0.100957, -0.093587, -0.20916}; struct Vector3 gPortalGunShootOffset = {0.120957, -0.113587, -0.08}; -struct Vector3 gPortalGunForward = {0.1f, -0.1f, 1.0f}; +struct Vector3 gPortalGunForward = {0.0f, -0.0f, 1.0f}; struct Vector3 gPortalGunShootForward = {0.3f, -0.25f, 1.0f}; struct Vector3 gPortalGunUp = {0.0f, 1.0f, 0.0f}; @@ -116,7 +116,7 @@ void portalBallRender(struct PortalGunProjectile* projectile, struct RenderState extern LookAt gLookAt; -void portalGunRenderReal(struct PortalGun* portalGun, struct RenderState* renderState, struct Camera* fromCamera, int portalGunVisible) { +void portalGunRenderReal(struct PortalGun* portalGun, struct RenderState* renderState, struct Camera* fromCamera, int portalGunVisible, int lastFiredIndex) { struct MaterialState materialState; materialStateInit(&materialState, DEFAULT_INDEX); @@ -146,11 +146,21 @@ void portalGunRenderReal(struct PortalGun* portalGun, struct RenderState* render cameraModifyProjectionViewForPortalGun(fromCamera, renderState, PORTAL_GUN_NEAR_PLANE * SCENE_SCALE, (float)SCREEN_WD / (float)SCREEN_HT); gSPLookAt(renderState->dl++, &gLookAt); + gDPPipeSync(renderState->dl++); + + if (lastFiredIndex >= 0 && lastFiredIndex <= 1) { + struct Coloru8 color = gProjectileColor[lastFiredIndex]; + gDPSetEnvColor(renderState->dl++, color.r, color.g, color.b, 255); + } else { + gDPSetEnvColor(renderState->dl++, 255, 255, 255, 255); + } transformToMatrixL(&portalGun->rigidBody.transform, matrix, 512); gSPMatrix(renderState->dl++, matrix, G_MTX_MODELVIEW | G_MTX_PUSH | G_MTX_MUL); gSPDisplayList(renderState->dl++, portal_gun_v_portalgun_model_gfx); gSPPopMatrix(renderState->dl++, G_MTX_MODELVIEW); + + gSPDisplayList(renderState->dl++, static_default); } #define NO_HIT_DISTANCE 20.0f diff --git a/src/scene/portal_gun.h b/src/scene/portal_gun.h index be7ea6e..a832ca5 100644 --- a/src/scene/portal_gun.h +++ b/src/scene/portal_gun.h @@ -39,7 +39,7 @@ struct PortalGun { void portalGunInit(struct PortalGun* portalGun, struct Transform* at); // void portalGunDummyRender(void* data, struct DynamicRenderDataList* renderList, struct RenderState* renderState); void portalGunUpdate(struct PortalGun* portalGun, struct Player* player); -void portalGunRenderReal(struct PortalGun* portalGun, struct RenderState* renderState, struct Camera* fromCamera, int portalGunVisible); +void portalGunRenderReal(struct PortalGun* portalGun, struct RenderState* renderState, struct Camera* fromCamera, int portalGunVisible, int lastFiredIndex); void portalGunFire(struct PortalGun* portalGun, int portalIndex, struct Ray* ray, struct Vector3* playerUp, int roomIndex); void portalGunFireWorld(struct PortalGun* portalGun, int portalIndex, struct Vector3* from, struct Vector3* to, int roomIndex); diff --git a/src/scene/scene.c b/src/scene/scene.c index d07433c..c93877f 100644 --- a/src/scene/scene.c +++ b/src/scene/scene.c @@ -308,7 +308,13 @@ void sceneRender(struct Scene* scene, struct RenderState* renderState, struct Gr // contactSolverDebugDraw(&gContactSolver, renderState); - portalGunRenderReal(&scene->portalGun, renderState, &scene->camera, scene->portalGun.portalGunVisible); + portalGunRenderReal( + &scene->portalGun, + renderState, + &scene->camera, + scene->portalGun.portalGunVisible, + scene->hud.lastPortalIndexShot + ); gDPPipeSync(renderState->dl++); gDPSetRenderMode(renderState->dl++, G_RM_OPA_SURF, G_RM_OPA_SURF2);