Revamped collision system
This commit is contained in:
@@ -13,11 +13,6 @@ namespace SplashEdit.EditorCode
|
||||
private SerializedProperty bitDepthProp;
|
||||
private SerializedProperty luaFileProp;
|
||||
private SerializedProperty collisionTypeProp;
|
||||
private SerializedProperty staticColliderProp;
|
||||
private SerializedProperty exportCollisionMeshProp;
|
||||
private SerializedProperty customCollisionMeshProp;
|
||||
private SerializedProperty collisionLayerProp;
|
||||
private SerializedProperty generateNavigationProp;
|
||||
|
||||
private MeshFilter meshFilter;
|
||||
private MeshRenderer meshRenderer;
|
||||
@@ -33,11 +28,6 @@ namespace SplashEdit.EditorCode
|
||||
bitDepthProp = serializedObject.FindProperty("bitDepth");
|
||||
luaFileProp = serializedObject.FindProperty("luaFile");
|
||||
collisionTypeProp = serializedObject.FindProperty("collisionType");
|
||||
staticColliderProp = serializedObject.FindProperty("staticCollider");
|
||||
exportCollisionMeshProp = serializedObject.FindProperty("exportCollisionMesh");
|
||||
customCollisionMeshProp = serializedObject.FindProperty("customCollisionMesh");
|
||||
collisionLayerProp = serializedObject.FindProperty("collisionLayer");
|
||||
generateNavigationProp = serializedObject.FindProperty("generateNavigation");
|
||||
|
||||
CacheMeshInfo();
|
||||
}
|
||||
@@ -165,32 +155,18 @@ namespace SplashEdit.EditorCode
|
||||
EditorGUILayout.PropertyField(collisionTypeProp, new GUIContent("Type"));
|
||||
|
||||
var collType = (PSXCollisionType)collisionTypeProp.enumValueIndex;
|
||||
if (collType != PSXCollisionType.None)
|
||||
if (collType == PSXCollisionType.Static)
|
||||
{
|
||||
EditorGUILayout.PropertyField(staticColliderProp, new GUIContent("Static"));
|
||||
|
||||
bool isStatic = staticColliderProp.boolValue;
|
||||
if (isStatic)
|
||||
{
|
||||
EditorGUILayout.LabelField(
|
||||
"<color=#88cc88>Baked into world collision mesh. No runtime cost.</color>",
|
||||
PSXEditorStyles.RichLabel);
|
||||
}
|
||||
else
|
||||
{
|
||||
EditorGUILayout.LabelField(
|
||||
"<color=#88aaff>Runtime AABB collider. Fires Lua collision events.</color>",
|
||||
PSXEditorStyles.RichLabel);
|
||||
}
|
||||
|
||||
EditorGUILayout.Space(2);
|
||||
EditorGUILayout.PropertyField(exportCollisionMeshProp, new GUIContent("Export Collision Mesh"));
|
||||
EditorGUILayout.PropertyField(customCollisionMeshProp, new GUIContent("Custom Mesh"));
|
||||
EditorGUILayout.PropertyField(collisionLayerProp, new GUIContent("Layer"));
|
||||
EditorGUILayout.LabelField(
|
||||
"<color=#88cc88>Baked into world collision mesh. No runtime cost.</color>",
|
||||
PSXEditorStyles.RichLabel);
|
||||
}
|
||||
else if (collType == PSXCollisionType.Dynamic)
|
||||
{
|
||||
EditorGUILayout.LabelField(
|
||||
"<color=#88aaff>Runtime AABB collider. Pushes player back + fires Lua events.</color>",
|
||||
PSXEditorStyles.RichLabel);
|
||||
}
|
||||
|
||||
EditorGUILayout.Space(4);
|
||||
EditorGUILayout.PropertyField(generateNavigationProp, new GUIContent("Generate Navigation"));
|
||||
|
||||
EditorGUI.indentLevel--;
|
||||
}
|
||||
@@ -231,5 +207,41 @@ namespace SplashEdit.EditorCode
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
|
||||
[DrawGizmo(GizmoType.Selected | GizmoType.NonSelected)]
|
||||
private static void DrawColliderGizmo(PSXObjectExporter exporter, GizmoType gizmoType)
|
||||
{
|
||||
if (exporter.CollisionType != PSXCollisionType.Dynamic) return;
|
||||
|
||||
MeshFilter mf = exporter.GetComponent<MeshFilter>();
|
||||
Mesh mesh = mf?.sharedMesh;
|
||||
if (mesh == null) return;
|
||||
|
||||
Bounds local = mesh.bounds;
|
||||
Matrix4x4 worldMatrix = exporter.transform.localToWorldMatrix;
|
||||
|
||||
Vector3 ext = local.extents;
|
||||
Vector3 center = local.center;
|
||||
Vector3 aabbMin = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
|
||||
Vector3 aabbMax = new Vector3(float.MinValue, float.MinValue, float.MinValue);
|
||||
|
||||
for (int i = 0; i < 8; i++)
|
||||
{
|
||||
Vector3 corner = center + new Vector3(
|
||||
(i & 1) != 0 ? ext.x : -ext.x,
|
||||
(i & 2) != 0 ? ext.y : -ext.y,
|
||||
(i & 4) != 0 ? ext.z : -ext.z
|
||||
);
|
||||
Vector3 world = worldMatrix.MultiplyPoint3x4(corner);
|
||||
aabbMin = Vector3.Min(aabbMin, world);
|
||||
aabbMax = Vector3.Max(aabbMax, world);
|
||||
}
|
||||
|
||||
bool selected = (gizmoType & GizmoType.Selected) != 0;
|
||||
Gizmos.color = selected ? new Color(0.2f, 0.8f, 1f, 0.8f) : new Color(0.2f, 0.8f, 1f, 0.3f);
|
||||
Vector3 c = (aabbMin + aabbMax) * 0.5f;
|
||||
Vector3 s = aabbMax - aabbMin;
|
||||
Gizmos.DrawWireCube(c, s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user