rodecomp/Source/Contents/Effects/EffectPrimitivePanels.cpp
ragnarok-clanker 9968deee82 Decompile 3 functions in Source/Contents/Effects/EffectPrimitivePanels.cpp, Source/Contents/Effects/EffectPrim.h
Batch #6239 by eAthena: 0 byte-identical, 3 confirmed by peer review.

- fn_19995 CEffectPrim::RenderFoldingRibbon: logic confirmed by peer review
- fn_20002 CEffectPrim::RenderStandingPanels: logic confirmed by peer review
- fn_20003 CEffectPrim::RenderHoverSquares: logic confirmed by peer review

Peer-reviewed-by: ragnarok-clanker, gordaoprogramas, Wizi
Accepted without human review: peers confirmed the logic ("same" ahead by at least 3, with 70% of the votes).
Adds to the build: Source/Contents/Effects/EffectPrimitivePanels.cpp
2026-10-30 20:12:50 +00:00

337 lines
13 KiB
C++

#include "Contents/Effects/EffectPrim.h"
#include "Contents/Effects/EffectPrimitiveState.h"
#include "Contents/MapSkyMgr.h"
#include "Utility/Math/AffineMatrix.h"
// OFFSET: 0x00BF4630
// FUNCTION: fn_19995
void CEffectPrim::RenderFoldingRibbon(matrix& wtm) {
vector3d vec[4];
for (int i = 0; i < 4; ++i) {
vec[i].x = 0.0f;
vec[i].y = 0.0f;
vec[i].z = 0.0f;
}
int rpCnt = 0;
for (int ec = 0; ec < 4; ++ec) {
EffectPrimitiveSlot& slot = this->state.slots[ec];
if (slot.life != 1 || slot.alphaB <= 0) {
continue;
}
const unsigned char shade = slot.height[3] == 1.0f ? 30 : 155;
{
const float dist = slot.distance;
const float edge = 12.0f - slot.height[9] * 24.0f;
const float cs = g_cosTable[slot.riseAngle];
const float sn = g_sinTable[slot.riseAngle];
const int angle = slot.riseAngle + (slot.riseAngle < 270 ? 90 : -270);
vec[0].x = dist * cs - -12.0f * sn + g_cosTable[angle] * 12.0f;
vec[0].y = slot.height[0];
vec[0].z = -12.0f * cs + dist * sn + g_sinTable[angle] * 12.0f;
vec[1].x = dist * cs - edge * sn + g_cosTable[angle] * 12.0f;
vec[1].y = slot.height[0];
vec[1].z = edge * cs + dist * sn + g_sinTable[angle] * 12.0f;
vec[2].x = -dist * cs - edge * sn + g_cosTable[angle] * 12.0f;
vec[2].y = slot.height[0];
vec[2].z = edge * cs + -dist * sn + g_sinTable[angle] * 12.0f;
vec[3].x = -dist * cs - -12.0f * sn + g_cosTable[angle] * 12.0f;
vec[3].y = slot.height[0];
vec[3].z = -12.0f * cs + -dist * sn + g_sinTable[angle] * 12.0f;
}
this->RenderTeiRect(&rpCnt, slot.alphaB, vec[0], vec[1], vec[2], vec[3], wtm, 0, static_cast<char>(slot.height[1]), 0, shade, shade, 255, 0.0f, 1.0f, slot.height[9], 1.0f, 0);
const float dist = slot.distance;
const float edge = 12.0f - slot.height[9] * 24.0f;
const float cs = g_cosTable[slot.riseAngle];
const float sn = g_sinTable[slot.riseAngle];
const int angle = slot.riseAngle + (slot.riseAngle < 270 ? 90 : -270);
vec[0].x = dist * cs - edge * sn + g_cosTable[angle] * 12.0f;
vec[0].y = slot.height[0];
vec[0].z = edge * cs + dist * sn + g_sinTable[angle] * 12.0f;
vec[1].x = dist * cs - 12.0f * sn + g_cosTable[angle] * 12.0f;
vec[1].y = slot.height[0];
vec[1].z = 12.0f * cs + dist * sn + g_sinTable[angle] * 12.0f;
vec[2].x = -dist * cs - 12.0f * sn + g_cosTable[angle] * 12.0f;
vec[2].y = slot.height[0];
vec[2].z = 12.0f * cs + -dist * sn + g_sinTable[angle] * 12.0f;
vec[3].x = -dist * cs - edge * sn + g_cosTable[angle] * 12.0f;
vec[3].y = slot.height[0];
vec[3].z = edge * cs + -dist * sn + g_sinTable[angle] * 12.0f;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec[0], vec[1], vec[2], vec[3], wtm, 0, static_cast<char>(slot.height[1]), 0, shade, shade, 255, 0.0f, 1.0f, 0.0f, slot.height[9], 0);
int bend = angle - 20;
if (bend < 0) {
bend += 360;
}
float rest = 1.0f - slot.height[9];
vec[0].x = g_cosTable[bend] * (rest * 32.0f) + vec[1].x;
vec[0].z = g_sinTable[bend] * (rest * 32.0f) + vec[1].z;
vec[3].x = g_cosTable[bend] * (rest * 40.0f) + vec[2].x;
vec[3].z = g_sinTable[bend] * (rest * 40.0f) + vec[2].z;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec[1], vec[0], vec[3], vec[2], wtm, 0, static_cast<char>(slot.height[1]), 0, shade, shade, 255, 0.0f, 1.0f, slot.height[9], 1.0f, 0);
vector3d mid1 = vec[0];
vector3d mid2 = vec[3];
vec[0].x = g_cosTable[bend] * 32.0f + vec[1].x;
vec[0].z = g_sinTable[bend] * 32.0f + vec[1].z;
vec[3].x = g_cosTable[bend] * 40.0f + vec[2].x;
vec[3].z = g_sinTable[bend] * 40.0f + vec[2].z;
vec[1] = mid1;
vec[2] = mid2;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec[1], vec[0], vec[3], vec[2], wtm, 0, static_cast<char>(slot.height[1]), 0, shade, shade, 255, 0.0f, 1.0f, 0.0f, slot.height[9], 0);
bend -= 20;
if (bend < 0) {
bend += 360;
}
rest = 1.0f - slot.height[9];
vec[1] = vec[0];
vec[2] = vec[3];
vec[0].x = g_cosTable[bend] * (rest * 32.0f) + vec[1].x;
vec[0].z = g_sinTable[bend] * (rest * 32.0f) + vec[1].z;
vec[3].x = g_cosTable[bend] * (rest * 40.0f) + vec[2].x;
vec[3].z = g_sinTable[bend] * (rest * 40.0f) + vec[2].z;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec[1], vec[0], vec[3], vec[2], wtm, 0, static_cast<char>(slot.height[1]), 0, shade, shade, 255, 0.0f, 1.0f, slot.height[9], 1.0f, 0);
mid1 = vec[0];
mid2 = vec[3];
vec[0].x = g_cosTable[bend] * 32.0f + vec[1].x;
vec[0].z = g_sinTable[bend] * 32.0f + vec[1].z;
vec[3].x = g_cosTable[bend] * 40.0f + vec[2].x;
vec[3].z = g_sinTable[bend] * 40.0f + vec[2].z;
vec[1] = mid1;
vec[2] = mid2;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec[1], vec[0], vec[3], vec[2], wtm, 0, static_cast<char>(slot.height[1]), 0, shade, shade, 255, 0.0f, 1.0f, 0.0f, slot.height[9], 0);
}
}
// OFFSET: 0x00BF7370
// FUNCTION: fn_20002
void CEffectPrim::RenderStandingPanels(matrix& wtm) {
vector3d vec1{};
vector3d vec2{};
vector3d vec3{};
vector3d vec4{};
int rpCnt = 0;
for (int ec = 0; ec < 4; ++ec) {
const EffectPrimitiveSlot& slot = this->state.slots[ec];
if (slot.life != 1 || slot.alphaB <= 0) {
continue;
}
const char frame = static_cast<char>(slot.process % 30);
float dist = slot.distance;
float cs = g_cosTable[slot.rotStart];
float sn = g_sinTable[slot.rotStart];
vec1.x = cs * (dist * g_depthAverageHalf) - sn * 0.0f;
vec1.y = -dist + -dist;
vec1.z = sn * (dist * g_depthAverageHalf) + cs * 0.0f;
vec2.x = cs * (dist * -0.5f) - sn * 0.0f;
vec2.y = -dist + -dist;
vec2.z = sn * (dist * -0.5f) + cs * 0.0f;
vec3.x = cs * (dist * -0.5f) - sn * dist;
vec3.y = -dist + -dist;
vec3.z = sn * (dist * -0.5f) + cs * dist;
vec4.x = cs * (dist * g_depthAverageHalf) - sn * dist;
vec4.y = -dist + -dist;
vec4.z = sn * (dist * g_depthAverageHalf) + cs * dist;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec1, vec2, vec3, vec4, wtm, 1, frame + 87, 0, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0);
dist = slot.distance;
cs = g_cosTable[slot.rotStart];
sn = g_sinTable[slot.rotStart];
vec1.x = cs * (dist * g_depthAverageHalf) - sn * 0.0f;
vec1.y = 0.0f;
vec1.z = sn * (dist * g_depthAverageHalf) + cs * 0.0f;
vec2.x = cs * (dist * -0.5f) - sn * 0.0f;
vec2.y = 0.0f;
vec2.z = sn * (dist * -0.5f) + cs * 0.0f;
vec3.x = cs * (dist * -0.5f) - sn * 0.0f;
vec3.y = -dist;
vec3.z = sn * (dist * -0.5f) + cs * 0.0f;
vec4.x = cs * (dist * g_depthAverageHalf) - sn * 0.0f;
vec4.y = -dist;
vec4.z = sn * (dist * g_depthAverageHalf) + cs * 0.0f;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec1, vec2, vec3, vec4, wtm, 1, frame, 0, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0);
dist = slot.distance;
cs = g_cosTable[slot.rotStart];
sn = g_sinTable[slot.rotStart];
vec1.x = cs * (dist * g_depthAverageHalf) - sn * 0.0f;
vec1.y = -dist;
vec1.z = sn * (dist * g_depthAverageHalf) + cs * 0.0f;
vec2.x = cs * (dist * -0.5f) - sn * 0.0f;
vec2.y = -dist;
vec2.z = sn * (dist * -0.5f) + cs * 0.0f;
vec3.x = cs * (dist * -0.5f) - sn * 0.0f;
vec3.y = -dist + -dist;
vec3.z = sn * (dist * -0.5f) + cs * 0.0f;
vec4.x = cs * (dist * g_depthAverageHalf) - sn * 0.0f;
vec4.y = -dist + -dist;
vec4.z = sn * (dist * g_depthAverageHalf) + cs * 0.0f;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec1, vec2, vec3, vec4, wtm, 1, frame + 30, 0, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0);
dist = slot.distance;
cs = g_cosTable[slot.rotStart];
sn = g_sinTable[slot.rotStart];
vec1.x = cs * (dist * 0.47f) - sn * -1.0f;
vec1.y = dist * -0.0f;
vec1.z = sn * (dist * 0.47f) + cs * -1.0f;
vec2.x = cs * (dist * -0.47f) - sn * -1.0f;
vec2.y = dist * -0.0f;
vec2.z = sn * (dist * -0.47f) + cs * -1.0f;
vec3.x = cs * (dist * -0.47f) - sn * -1.0f;
vec3.y = dist * -0.6f;
vec3.z = sn * (dist * -0.47f) + cs * -1.0f;
vec4.x = cs * (dist * 0.47f) - sn * -1.0f;
vec4.y = dist * -0.6f;
vec4.z = sn * (dist * 0.47f) + cs * -1.0f;
this->RenderTeiRect(&rpCnt, slot.alphaB, vec1, vec2, vec3, vec4, wtm, 1, static_cast<char>(slot.process % 27) + 60, 0, 255, 255, 255, 0.0f, 1.0f, 0.0f, 1.0f, 0);
}
}
// OFFSET: 0x00BF7960
// FUNCTION: fn_20003
void CEffectPrim::RenderHoverSquares(matrix& wtm) {
vector3d vec1{};
vector3d vec2{};
vector3d vec3{};
vector3d vec4{};
int rpCnt = 0;
for (int ec = 0; ec < 4; ++ec) {
EffectPrimitiveSlot& slot = this->state.slots[ec];
if (slot.life != 1) {
continue;
}
vec1.y = 0.0f;
vec2.y = 0.0f;
vec3.y = 0.0f;
vec4.y = 0.0f;
const unsigned short red = static_cast<unsigned short>(slot.flag1[10] * 2.57f);
const unsigned short green = static_cast<unsigned short>(slot.flag1[11] * 2.57f);
const unsigned short blue = static_cast<unsigned short>(slot.flag1[12] * 2.57f);
vec1.x = slot.distance * g_cosTable[45];
vec1.z = slot.distance * g_sinTable[45];
vec2.x = slot.distance * g_cosTable[135];
vec2.z = slot.distance * g_sinTable[135];
vec3.x = slot.distance * g_cosTable[225];
vec3.z = slot.distance * g_sinTable[225];
vec4.x = slot.distance * g_cosTable[315];
vec4.z = slot.distance * g_sinTable[315];
this->Tei_TowardScreen(vec1, vec2, vec3, vec4, this->state.slots[0].alphaT, this->state.slots[1].alphaT);
const float x1 = vec1.x;
const float y1 = vec1.y;
const float z1 = vec1.z;
const float x2 = vec2.x;
const float y2 = vec2.y;
const float z2 = vec2.z;
const float x3 = vec3.x;
const float y3 = vec3.y;
const float z3 = vec3.z;
const float x4 = vec4.x;
const float y4 = vec4.y;
const float z4 = vec4.z;
vec1.x = slot.vecBPre.x + x1;
vec1.y = slot.vecBPre.y + y1;
vec1.z = slot.vecBPre.z + z1;
vec2.x = slot.vecBPre.x + x2;
vec2.y = slot.vecBPre.y + y2;
vec2.z = slot.vecBPre.z + z2;
vec3.x = slot.vecBPre.x + x3;
vec3.y = slot.vecBPre.y + y3;
vec3.z = slot.vecBPre.z + z3;
vec4.x = slot.vecBPre.x + x4;
vec4.y = slot.vecBPre.y + y4;
vec4.z = slot.vecBPre.z + z4;
int alpha = 50;
if (vec1.y < -4.0f) {
alpha = static_cast<int>((vec1.y + 4.0f) * 15.0f + 50.0f);
}
if (vec1.y > -0.5f) {
alpha = static_cast<int>(vec1.y * -100.0f);
}
if (vec1.y <= 0.0f) {
this->RenderTeiRect(&rpCnt, static_cast<short>(alpha < 0 ? 0 : alpha), vec1, vec2, vec3, vec4, wtm, 0, 0, 0, red, green, blue, 0.0f, 1.0f, 0.0f, 1.0f, 0);
}
vec1.x = slot.vecBNow.x + x1;
vec1.y = slot.vecBNow.y + y1;
vec1.z = slot.vecBNow.z + z1;
vec2.x = slot.vecBNow.x + x2;
vec2.y = slot.vecBNow.y + y2;
vec2.z = slot.vecBNow.z + z2;
vec3.x = slot.vecBNow.x + x3;
vec3.y = slot.vecBNow.y + y3;
vec3.z = slot.vecBNow.z + z3;
vec4.x = slot.vecBNow.x + x4;
vec4.y = slot.vecBNow.y + y4;
vec4.z = slot.vecBNow.z + z4;
alpha = 50;
if (vec1.y < -4.0f) {
alpha = static_cast<int>((vec1.y + 4.0f) * 15.0f + 50.0f);
}
if (vec1.y > -0.5f) {
alpha = static_cast<int>(vec1.y * -100.0f);
}
if (vec1.y <= 0.0f) {
this->RenderTeiRect(&rpCnt, static_cast<short>(alpha < 0 ? 0 : alpha), vec1, vec2, vec3, vec4, wtm, 0, 0, 0, red, green, blue, 0.0f, 1.0f, 0.0f, 1.0f, 0);
}
vec1.x = slot.vecTPre.x + x1;
vec1.y = slot.vecTPre.y + y1;
vec1.z = slot.vecTPre.z + z1;
vec2.x = slot.vecTPre.x + x2;
vec2.y = slot.vecTPre.y + y2;
vec2.z = slot.vecTPre.z + z2;
vec3.x = slot.vecTPre.x + x3;
vec3.y = slot.vecTPre.y + y3;
vec3.z = slot.vecTPre.z + z3;
vec4.x = slot.vecTPre.x + x4;
vec4.y = slot.vecTPre.y + y4;
vec4.z = slot.vecTPre.z + z4;
alpha = 50;
if (vec1.y < -4.0f) {
alpha = static_cast<int>((vec1.y + 4.0f) * 15.0f + 50.0f);
}
if (vec1.y > -0.5f) {
alpha = static_cast<int>(vec1.y * -100.0f);
}
if (vec1.y <= 0.0f) {
this->RenderTeiRect(&rpCnt, static_cast<short>(alpha < 0 ? 0 : alpha), vec1, vec2, vec3, vec4, wtm, 0, 0, 0, red, green, blue, 0.0f, 1.0f, 0.0f, 1.0f, 0);
}
vec1.x = slot.vecTNow.x + x1;
vec1.y = slot.vecTNow.y + y1;
vec1.z = slot.vecTNow.z + z1;
vec2.x = slot.vecTNow.x + x2;
vec2.y = slot.vecTNow.y + y2;
vec2.z = slot.vecTNow.z + z2;
vec3.x = slot.vecTNow.x + x3;
vec3.y = slot.vecTNow.y + y3;
vec3.z = slot.vecTNow.z + z3;
vec4.x = slot.vecTNow.x + x4;
vec4.y = slot.vecTNow.y + y4;
vec4.z = slot.vecTNow.z + z4;
alpha = 50;
if (vec1.y < -4.0f) {
alpha = static_cast<int>((vec1.y + 4.0f) * 15.0f + 50.0f);
}
if (vec1.y > -0.5f) {
alpha = static_cast<int>(vec1.y * -100.0f);
}
if (vec1.y <= 0.0f) {
this->RenderTeiRect(&rpCnt, static_cast<short>(alpha < 0 ? 0 : alpha), vec1, vec2, vec3, vec4, wtm, 0, 0, 0, red, green, blue, 0.0f, 1.0f, 0.0f, 1.0f, 0);
}
}
}