Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
A
AVVR-Unity
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Deploy
Releases
Package registry
Model registry
Operate
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
GDP Project 4
AVVR-Unity
Commits
a24b72b4
Commit
a24b72b4
authored
7 months ago
by
mhby1g21
Browse files
Options
Downloads
Patches
Plain Diff
more meshdimension script changes
parent
f22bd209
Branches
Branches containing commit
No related tags found
1 merge request
!2
Gdp 4.2.16 - Refactor Unity utilities tools to be windowed menu instead of prefabs
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
AVVR/Assets/_Scripts/MeshDimensionCalculator.cs
+107
-148
107 additions, 148 deletions
AVVR/Assets/_Scripts/MeshDimensionCalculator.cs
with
107 additions
and
148 deletions
AVVR/Assets/_Scripts/MeshDimensionCalculator.cs
+
107
−
148
View file @
a24b72b4
using
UnityEngine
;
using
System.Collections.Generic
;
#if UNITY_EDITOR
#if UNITY_EDITOR
using
UnityEngine
;
using
UnityEditor
;
using
UnityEditor
;
#endif
using
System.Collections.Generic
;
public
class
MeshDimensionCalculator
:
MonoBehaviour
// Shared data structure for dimension results
public
class
DimensionResults
{
{
public
GameObject
targetObject
;
public
Vector3
totalMin
=
Vector3
.
positiveInfinity
;
p
rivate
Vector3
totalM
in
=
Vector3
.
posi
tiveInfinity
;
p
ublic
Vector3
totalM
ax
=
Vector3
.
nega
tiveInfinity
;
p
rivate
Vector3
totalMax
=
Vector3
.
negativeInfinity
;
p
ublic
Vector3
dimensions
;
p
rivate
Vector3
dimensions
;
p
ublic
Vector3
center
;
private
Vector3
center
;
}
[
SerializeField
]
private
Vector3
scaleFactors
=
Vector3
.
one
;
// Shared logic class
[
SerializeField
]
private
float
uniformScaleFactor
=
1f
;
public
static
class
MeshDimensionCalculatorLogic
public
void
CalculateDimensions
()
{
public
static
DimensionResults
CalculateDimensions
(
GameObject
targetObject
)
{
{
if
(
targetObject
==
null
)
if
(
targetObject
==
null
)
{
{
Debug
.
LogError
(
"Target object is not assigned!"
);
Debug
.
LogError
(
"Target object is not assigned!"
);
return
;
return
null
;
}
}
totalMin
=
Vector3
.
positiveInfinity
;
DimensionResults
results
=
new
DimensionResults
();
totalMax
=
Vector3
.
negativeInfinity
;
List
<
MeshFilter
>
meshFilters
=
new
List
<
MeshFilter
>();
List
<
MeshFilter
>
meshFilters
=
new
List
<
MeshFilter
>();
CollectMeshFilters
(
targetObject
.
transform
,
meshFilters
);
CollectMeshFilters
(
targetObject
.
transform
,
meshFilters
);
if
(
meshFilters
.
Count
==
0
)
if
(
meshFilters
.
Count
==
0
)
{
{
Debug
.
LogError
(
"No meshes found in the target object's hierarchy!"
);
Debug
.
LogError
(
"No meshes found in the target object's hierarchy!"
);
return
;
return
null
;
}
}
foreach
(
MeshFilter
meshFilter
in
meshFilters
)
foreach
(
MeshFilter
meshFilter
in
meshFilters
)
...
@@ -43,20 +42,22 @@ public class MeshDimensionCalculator : MonoBehaviour
...
@@ -43,20 +42,22 @@ public class MeshDimensionCalculator : MonoBehaviour
for
(
int
i
=
0
;
i
<
vertices
.
Length
;
i
++)
for
(
int
i
=
0
;
i
<
vertices
.
Length
;
i
++)
{
{
Vector3
worldVertex
=
meshFilter
.
transform
.
TransformPoint
(
vertices
[
i
]);
Vector3
worldVertex
=
meshFilter
.
transform
.
TransformPoint
(
vertices
[
i
]);
totalMin
=
Vector3
.
Min
(
totalMin
,
worldVertex
);
results
.
totalMin
=
Vector3
.
Min
(
results
.
totalMin
,
worldVertex
);
totalMax
=
Vector3
.
Max
(
totalMax
,
worldVertex
);
results
.
totalMax
=
Vector3
.
Max
(
results
.
totalMax
,
worldVertex
);
}
}
}
}
dimensions
=
totalMax
-
totalMin
;
results
.
dimensions
=
results
.
totalMax
-
results
.
totalMin
;
center
=
(
totalMin
+
totalMax
)
/
2
;
results
.
center
=
(
results
.
totalMin
+
results
.
totalMax
)
/
2
;
Debug
.
Log
(
$"Total Dimensions:
{
results
.
dimensions
}
"
);
Debug
.
Log
(
$"Center:
{
results
.
center
}
"
);
Debug
.
Log
(
$"Floor Y position:
{
results
.
totalMin
.
y
}
"
);
Debug
.
Log
(
$"Total Dimensions:
{
dimensions
}
"
);
return
results
;
Debug
.
Log
(
$"Center:
{
center
}
"
);
Debug
.
Log
(
$"Floor Y position:
{
totalMin
.
y
}
"
);
}
}
private
void
CollectMeshFilters
(
Transform
parent
,
List
<
MeshFilter
>
meshFilters
)
private
static
void
CollectMeshFilters
(
Transform
parent
,
List
<
MeshFilter
>
meshFilters
)
{
{
MeshFilter
meshFilter
=
parent
.
GetComponent
<
MeshFilter
>();
MeshFilter
meshFilter
=
parent
.
GetComponent
<
MeshFilter
>();
if
(
meshFilter
!=
null
)
if
(
meshFilter
!=
null
)
...
@@ -70,7 +71,7 @@ public class MeshDimensionCalculator : MonoBehaviour
...
@@ -70,7 +71,7 @@ public class MeshDimensionCalculator : MonoBehaviour
}
}
}
}
public
void
ResetToOrigin
()
public
static
void
ResetToOrigin
(
GameObject
targetObject
)
{
{
if
(
targetObject
==
null
)
if
(
targetObject
==
null
)
{
{
...
@@ -78,11 +79,12 @@ public class MeshDimensionCalculator : MonoBehaviour
...
@@ -78,11 +79,12 @@ public class MeshDimensionCalculator : MonoBehaviour
return
;
return
;
}
}
Undo
.
RecordObject
(
targetObject
.
transform
,
"Reset To Origin"
);
targetObject
.
transform
.
position
=
Vector3
.
zero
;
targetObject
.
transform
.
position
=
Vector3
.
zero
;
Debug
.
Log
(
"Target object has been reset to (0,0,0)."
);
Debug
.
Log
(
"Target object has been reset to (0,0,0)."
);
}
}
public
void
ResetFloorToZero
()
public
static
void
ResetFloorToZero
(
GameObject
targetObject
,
float
floorY
)
{
{
if
(
targetObject
==
null
)
if
(
targetObject
==
null
)
{
{
...
@@ -90,18 +92,14 @@ public class MeshDimensionCalculator : MonoBehaviour
...
@@ -90,18 +92,14 @@ public class MeshDimensionCalculator : MonoBehaviour
return
;
return
;
}
}
if
(
totalMin
.
y
==
Mathf
.
Infinity
)
Undo
.
RecordObject
(
targetObject
.
transform
,
"Reset Floor To Zero"
);
{
Debug
.
LogWarning
(
"Please calculate dimensions first!"
);
return
;
}
Vector3
currentPosition
=
targetObject
.
transform
.
position
;
Vector3
currentPosition
=
targetObject
.
transform
.
position
;
targetObject
.
transform
.
position
=
new
Vector3
(
currentPosition
.
x
,
-
totalMin
.
y
,
currentPosition
.
z
);
Vector3
newPosition
=
new
Vector3
(
currentPosition
.
x
,
-
floorY
,
currentPosition
.
z
);
Debug
.
Log
(
$"Target object floor has been reset to Y = 0. New position:
{
targetObject
.
transform
.
position
}
"
);
targetObject
.
transform
.
position
=
newPosition
;
Debug
.
Log
(
$"Target object floor has been reset to Y = 0. New position:
{
newPosition
}
"
);
}
}
public
void
ScaleObject
()
public
static
void
ScaleObject
(
GameObject
targetObject
,
Vector3
scaleFactors
)
{
{
if
(
targetObject
==
null
)
if
(
targetObject
==
null
)
{
{
...
@@ -109,18 +107,14 @@ public class MeshDimensionCalculator : MonoBehaviour
...
@@ -109,18 +107,14 @@ public class MeshDimensionCalculator : MonoBehaviour
return
;
return
;
}
}
Undo
.
RecordObject
(
targetObject
.
transform
,
"Scale Object"
);
Vector3
currentScale
=
targetObject
.
transform
.
localScale
;
Vector3
currentScale
=
targetObject
.
transform
.
localScale
;
Vector3
newScale
=
new
Vector3
(
Vector3
newScale
=
Vector3
.
Scale
(
currentScale
,
scaleFactors
);
currentScale
.
x
*
scaleFactors
.
x
,
currentScale
.
y
*
scaleFactors
.
y
,
currentScale
.
z
*
scaleFactors
.
z
);
targetObject
.
transform
.
localScale
=
newScale
;
targetObject
.
transform
.
localScale
=
newScale
;
Debug
.
Log
(
$"Target object scaled. New scale:
{
newScale
}
"
);
Debug
.
Log
(
$"Target object scaled. New scale:
{
newScale
}
"
);
}
}
public
void
ScaleObjectUniform
()
public
static
void
ScaleObjectUniform
(
GameObject
targetObject
,
float
uniformScaleFactor
)
{
{
if
(
targetObject
==
null
)
if
(
targetObject
==
null
)
{
{
...
@@ -128,14 +122,14 @@ public class MeshDimensionCalculator : MonoBehaviour
...
@@ -128,14 +122,14 @@ public class MeshDimensionCalculator : MonoBehaviour
return
;
return
;
}
}
Undo
.
RecordObject
(
targetObject
.
transform
,
"Scale Object Uniform"
);
Vector3
currentScale
=
targetObject
.
transform
.
localScale
;
Vector3
currentScale
=
targetObject
.
transform
.
localScale
;
Vector3
newScale
=
currentScale
*
uniformScaleFactor
;
Vector3
newScale
=
currentScale
*
uniformScaleFactor
;
targetObject
.
transform
.
localScale
=
newScale
;
targetObject
.
transform
.
localScale
=
newScale
;
Debug
.
Log
(
$"Target object scaled uniformly. New scale:
{
newScale
}
"
);
Debug
.
Log
(
$"Target object scaled uniformly. New scale:
{
newScale
}
"
);
}
}
public
void
ResetScale
()
public
static
void
ResetScale
(
GameObject
targetObject
)
{
{
if
(
targetObject
==
null
)
if
(
targetObject
==
null
)
{
{
...
@@ -143,12 +137,58 @@ public class MeshDimensionCalculator : MonoBehaviour
...
@@ -143,12 +137,58 @@ public class MeshDimensionCalculator : MonoBehaviour
return
;
return
;
}
}
Undo
.
RecordObject
(
targetObject
.
transform
,
"Reset Scale"
);
targetObject
.
transform
.
localScale
=
Vector3
.
one
;
targetObject
.
transform
.
localScale
=
Vector3
.
one
;
Debug
.
Log
(
"Target object scale has been reset to (1, 1, 1)."
);
Debug
.
Log
(
"Target object scale has been reset to (1, 1, 1)."
);
}
}
}
}
#if UNITY_EDITOR
// MonoBehaviour Component
public
class
MeshDimensionCalculator
:
MonoBehaviour
{
public
GameObject
targetObject
;
private
DimensionResults
results
;
[
SerializeField
]
private
Vector3
scaleFactors
=
Vector3
.
one
;
[
SerializeField
]
private
float
uniformScaleFactor
=
1f
;
public
void
CalculateDimensions
()
{
results
=
MeshDimensionCalculatorLogic
.
CalculateDimensions
(
targetObject
);
}
public
void
ResetToOrigin
()
{
MeshDimensionCalculatorLogic
.
ResetToOrigin
(
targetObject
);
}
public
void
ResetFloorToZero
()
{
if
(
results
==
null
||
results
.
totalMin
.
y
==
Mathf
.
Infinity
)
{
Debug
.
LogWarning
(
"Please calculate dimensions first!"
);
return
;
}
MeshDimensionCalculatorLogic
.
ResetFloorToZero
(
targetObject
,
results
.
totalMin
.
y
);
}
public
void
ScaleObject
()
{
MeshDimensionCalculatorLogic
.
ScaleObject
(
targetObject
,
scaleFactors
);
}
public
void
ScaleObjectUniform
()
{
MeshDimensionCalculatorLogic
.
ScaleObjectUniform
(
targetObject
,
uniformScaleFactor
);
}
public
void
ResetScale
()
{
MeshDimensionCalculatorLogic
.
ResetScale
(
targetObject
);
}
}
// Inspector UI for the MonoBehaviour component
[
CustomEditor
(
typeof
(
MeshDimensionCalculator
))]
[
CustomEditor
(
typeof
(
MeshDimensionCalculator
))]
public
class
MeshDimensionCalculatorEditor
:
Editor
public
class
MeshDimensionCalculatorEditor
:
Editor
{
{
...
@@ -167,7 +207,7 @@ public class MeshDimensionCalculatorEditor : Editor
...
@@ -167,7 +207,7 @@ public class MeshDimensionCalculatorEditor : Editor
{
{
serializedObject
.
Update
();
serializedObject
.
Update
();
EditorGUILayout
.
PropertyField
(
targetObjectProperty
);
EditorGUILayout
.
PropertyField
(
targetObjectProperty
,
new
GUIContent
(
"ModelWrapper"
)
);
MeshDimensionCalculator
calculator
=
(
MeshDimensionCalculator
)
target
;
MeshDimensionCalculator
calculator
=
(
MeshDimensionCalculator
)
target
;
...
@@ -214,13 +254,11 @@ public class MeshDimensionCalculatorEditor : Editor
...
@@ -214,13 +254,11 @@ public class MeshDimensionCalculatorEditor : Editor
}
}
}
}
// Editor Window
public
class
MeshDimensionCalculatorWindow
:
EditorWindow
public
class
MeshDimensionCalculatorWindow
:
EditorWindow
{
{
private
GameObject
targetObject
;
private
GameObject
targetObject
;
private
Vector3
dimensions
;
private
DimensionResults
results
;
private
Vector3
center
;
private
Vector3
totalMin
;
private
Vector3
totalMax
;
private
Vector3
scaleFactors
=
Vector3
.
one
;
private
Vector3
scaleFactors
=
Vector3
.
one
;
private
float
uniformScaleFactor
=
1f
;
private
float
uniformScaleFactor
=
1f
;
...
@@ -241,17 +279,25 @@ public class MeshDimensionCalculatorWindow : EditorWindow
...
@@ -241,17 +279,25 @@ public class MeshDimensionCalculatorWindow : EditorWindow
if
(
GUILayout
.
Button
(
"Calculate Dimensions"
))
if
(
GUILayout
.
Button
(
"Calculate Dimensions"
))
{
{
CalculateDimensions
();
results
=
MeshDimensionCalculatorLogic
.
CalculateDimensions
(
targetObject
);
Repaint
();
}
}
if
(
GUILayout
.
Button
(
"Reset to Origin (0,0,0)"
))
if
(
GUILayout
.
Button
(
"Reset to Origin (0,0,0)"
))
{
{
ResetToOrigin
();
MeshDimensionCalculatorLogic
.
ResetToOrigin
(
targetObject
);
}
}
if
(
GUILayout
.
Button
(
"Reset Floor to Y = 0"
))
if
(
GUILayout
.
Button
(
"Reset Floor to Y = 0"
))
{
{
ResetFloorToZero
();
if
(
results
!=
null
)
{
MeshDimensionCalculatorLogic
.
ResetFloorToZero
(
targetObject
,
results
.
totalMin
.
y
);
}
else
{
EditorUtility
.
DisplayDialog
(
"Error"
,
"Please calculate dimensions first!"
,
"OK"
);
}
}
}
EditorGUILayout
.
Space
();
EditorGUILayout
.
Space
();
...
@@ -260,7 +306,7 @@ public class MeshDimensionCalculatorWindow : EditorWindow
...
@@ -260,7 +306,7 @@ public class MeshDimensionCalculatorWindow : EditorWindow
scaleFactors
=
EditorGUILayout
.
Vector3Field
(
"Scale Factors (X, Y, Z)"
,
scaleFactors
);
scaleFactors
=
EditorGUILayout
.
Vector3Field
(
"Scale Factors (X, Y, Z)"
,
scaleFactors
);
if
(
GUILayout
.
Button
(
"Apply Scale (X, Y, Z)"
))
if
(
GUILayout
.
Button
(
"Apply Scale (X, Y, Z)"
))
{
{
ScaleObject
(
);
MeshDimensionCalculatorLogic
.
ScaleObject
(
targetObject
,
scaleFactors
);
}
}
EditorGUILayout
.
Space
();
EditorGUILayout
.
Space
();
...
@@ -268,112 +314,25 @@ public class MeshDimensionCalculatorWindow : EditorWindow
...
@@ -268,112 +314,25 @@ public class MeshDimensionCalculatorWindow : EditorWindow
uniformScaleFactor
=
EditorGUILayout
.
FloatField
(
"Uniform Scale Factor"
,
uniformScaleFactor
);
uniformScaleFactor
=
EditorGUILayout
.
FloatField
(
"Uniform Scale Factor"
,
uniformScaleFactor
);
if
(
GUILayout
.
Button
(
"Apply Uniform Scale"
))
if
(
GUILayout
.
Button
(
"Apply Uniform Scale"
))
{
{
ScaleObjectUniform
(
);
MeshDimensionCalculatorLogic
.
ScaleObjectUniform
(
targetObject
,
uniformScaleFactor
);
}
}
EditorGUILayout
.
Space
();
EditorGUILayout
.
Space
();
if
(
GUILayout
.
Button
(
"Reset Scale to (1, 1, 1)"
))
if
(
GUILayout
.
Button
(
"Reset Scale to (1, 1, 1)"
))
{
{
ResetScale
(
);
MeshDimensionCalculatorLogic
.
ResetScale
(
targetObject
);
}
}
EditorGUI
.
EndDisabledGroup
();
EditorGUI
.
EndDisabledGroup
();
if
(
targetObject
!=
null
&&
dimensions
!=
Vector3
.
zero
)
if
(
results
!=
null
&&
results
.
dimensions
!=
Vector3
.
zero
)
{
{
EditorGUILayout
.
Space
();
EditorGUILayout
.
Space
();
EditorGUILayout
.
LabelField
(
"Results:"
,
EditorStyles
.
boldLabel
);
EditorGUILayout
.
LabelField
(
"Results:"
,
EditorStyles
.
boldLabel
);
EditorGUILayout
.
Vector3Field
(
"Dimensions"
,
dimensions
);
EditorGUILayout
.
Vector3Field
(
"Dimensions"
,
results
.
dimensions
);
EditorGUILayout
.
Vector3Field
(
"Center"
,
center
);
EditorGUILayout
.
Vector3Field
(
"Center"
,
results
.
center
);
EditorGUILayout
.
FloatField
(
"Floor Y Position"
,
totalMin
.
y
);
EditorGUILayout
.
FloatField
(
"Floor Y Position"
,
results
.
totalMin
.
y
);
}
}
private
void
CalculateDimensions
()
{
if
(
targetObject
==
null
)
return
;
totalMin
=
Vector3
.
positiveInfinity
;
totalMax
=
Vector3
.
negativeInfinity
;
List
<
MeshFilter
>
meshFilters
=
new
List
<
MeshFilter
>();
CollectMeshFilters
(
targetObject
.
transform
,
meshFilters
);
if
(
meshFilters
.
Count
==
0
)
{
EditorUtility
.
DisplayDialog
(
"Error"
,
"No meshes found in the target object's hierarchy!"
,
"OK"
);
return
;
}
foreach
(
MeshFilter
meshFilter
in
meshFilters
)
{
Mesh
mesh
=
meshFilter
.
sharedMesh
;
if
(
mesh
==
null
)
continue
;
Vector3
[]
vertices
=
mesh
.
vertices
;
for
(
int
i
=
0
;
i
<
vertices
.
Length
;
i
++)
{
Vector3
worldVertex
=
meshFilter
.
transform
.
TransformPoint
(
vertices
[
i
]);
totalMin
=
Vector3
.
Min
(
totalMin
,
worldVertex
);
totalMax
=
Vector3
.
Max
(
totalMax
,
worldVertex
);
}
}
dimensions
=
totalMax
-
totalMin
;
center
=
(
totalMin
+
totalMax
)
/
2
;
Repaint
();
}
private
void
ScaleObject
()
{
if
(
targetObject
==
null
)
return
;
Undo
.
RecordObject
(
targetObject
.
transform
,
"Scale Object"
);
targetObject
.
transform
.
localScale
=
Vector3
.
Scale
(
targetObject
.
transform
.
localScale
,
scaleFactors
);
}
private
void
ScaleObjectUniform
()
{
if
(
targetObject
==
null
)
return
;
Undo
.
RecordObject
(
targetObject
.
transform
,
"Scale Object Uniform"
);
targetObject
.
transform
.
localScale
*=
uniformScaleFactor
;
}
private
void
ResetScale
()
{
if
(
targetObject
==
null
)
return
;
Undo
.
RecordObject
(
targetObject
.
transform
,
"Reset Scale"
);
targetObject
.
transform
.
localScale
=
Vector3
.
one
;
}
private
void
ResetToOrigin
()
{
if
(
targetObject
==
null
)
return
;
Undo
.
RecordObject
(
targetObject
.
transform
,
"Reset To Origin"
);
targetObject
.
transform
.
position
=
Vector3
.
zero
;
}
private
void
ResetFloorToZero
()
{
if
(
targetObject
==
null
)
return
;
CalculateDimensions
();
Undo
.
RecordObject
(
targetObject
.
transform
,
"Reset Floor To Zero"
);
Vector3
newPosition
=
targetObject
.
transform
.
position
;
newPosition
.
y
-=
totalMin
.
y
;
targetObject
.
transform
.
position
=
newPosition
;
}
private
void
CollectMeshFilters
(
Transform
parent
,
List
<
MeshFilter
>
meshFilters
)
{
MeshFilter
meshFilter
=
parent
.
GetComponent
<
MeshFilter
>();
if
(
meshFilter
!=
null
)
{
meshFilters
.
Add
(
meshFilter
);
}
for
(
int
i
=
0
;
i
<
parent
.
childCount
;
i
++)
{
CollectMeshFilters
(
parent
.
GetChild
(
i
),
meshFilters
);
}
}
}
}
}
}
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment