60 lines
2.4 KiB
C#
60 lines
2.4 KiB
C#
using AC2RE.Definitions;
|
|
using System.Numerics;
|
|
|
|
namespace LandblockExtraction.Tools {
|
|
public static class MathOperations {
|
|
public static uint GetXLandblock(uint landblock) {
|
|
return (landblock & 0xFF000000) >> 24;
|
|
}
|
|
public static uint GetYLandblock(uint landblock) {
|
|
return (landblock & 0x00FF0000) >> 16;
|
|
}
|
|
public static uint GetTerrainInCellInfo(uint cellInfo) {
|
|
return (cellInfo >> 0) & (0x7f);
|
|
}
|
|
public static uint GetRoadInCellInfo(uint cellInfo) {
|
|
return (cellInfo >> 24) & (0xff);
|
|
}
|
|
public static uint GetColorInCellInfo(uint cellInfo) {
|
|
return (cellInfo >> 16) & (0xff);
|
|
}
|
|
public static uint GetSceneInCellInfo(uint cellInfo) {
|
|
return (cellInfo >> 7) & (0x1f);
|
|
}
|
|
public static Vector4 RGBAColorToVector4(RGBAColor color) {
|
|
return new Vector4(color.r, color.g, color.b, color.a);
|
|
}
|
|
// Calcule la normale d'un triangle à partir de trois points
|
|
public static Vector3 CalculateTriangleNormal(Vector3 A, Vector3 B, Vector3 C) {
|
|
Vector3 AB = B - A;
|
|
Vector3 AC = C - A;
|
|
Vector3 normal = Vector3.Cross(AB, AC);
|
|
normal = Vector3.Normalize(normal);
|
|
return normal;
|
|
}
|
|
|
|
// Calcule la normale moyenne d'un quadrilatère en utilisant deux de ses triangles
|
|
public static Vector3 CalculateQuadNormal(Vector3 A, Vector3 B, Vector3 C, Vector3 D) {
|
|
Vector3 normal1 = CalculateTriangleNormal(A, B, C);
|
|
Vector3 normal2 = CalculateTriangleNormal(C, B, D);
|
|
|
|
Vector3 averageNormal = (normal1 + normal2) / 2;
|
|
return Vector3.Normalize(averageNormal);
|
|
}
|
|
public static float CalculateInclination(Vector3 normal) {
|
|
Vector3 up = new Vector3(0, 0, 1); // Vecteur vertical de référence
|
|
|
|
normal = Vector3.Normalize(normal); // Normaliser la normale
|
|
|
|
float dotProduct = Vector3.Dot(normal, up); // Produit scalaire entre la normale et le vecteur vertical
|
|
|
|
// Calculer le cosinus de l'angle
|
|
float cosTheta = dotProduct;
|
|
|
|
// Calculer le sinus de l'angle à partir du cosinus
|
|
float sinTheta = (float)Math.Sqrt(1 - cosTheta * cosTheta);
|
|
|
|
return sinTheta; // Retourner l'angle d'inclinaison variant de 0 à 1
|
|
}
|
|
}
|
|
}
|