Skip to content

Commit 7d64ff2

Browse files
committed
fix: reverting back to using CoordinateSpace and CoordinateTransform as the base classes
- ReferenceAtlas needs a base class for the coordinate spaces, otherwise spaces like EphysLinkSpace don't actually make sense - Same for coordtransform, we still need a concept for a transform that is separate from an atlas
1 parent efe400e commit 7d64ff2

15 files changed

+246
-117
lines changed

Assets/Scripts/Editor/BrainAtlasTest.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using BrainAtlas;
2+
using BrainAtlas.CoordinateSystems;
23
using System.Collections.Generic;
34
using System.Threading.Tasks;
45
using UnityEngine;

Assets/Scripts/Editor/Pipeline.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public static void RunPipeline()
4646

4747

4848
////Build the Atlas ScriptableObjects
49-
//AtlasMeta2SO(updatedAtlasInfo);
49+
AtlasMeta2SO(updatedAtlasInfo);
5050

5151
////Convert mesh files 2 prefabs
5252
//MeshFiles2Prefabs(updatedAtlasInfo);

Packages/vbl.brainatlas/Scripts/Runtime/Atlas/ReferenceAtlas.cs

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using System.Collections.Generic;
44
using System.Threading.Tasks;
55
using UnityEngine;
6+
using BrainAtlas.CoordinateSystems;
67

78
namespace BrainAtlas
89
{
@@ -25,7 +26,7 @@ public class ReferenceAtlas
2526
public string Name { get => _data.name; }
2627

2728
/// <summary>
28-
/// Dimensions of the Atlas
29+
/// Dimensions of the Atlas in mm
2930
/// </summary>
3031
public Vector3 Dimensions { get => _data.Dimensions; }
3132

@@ -47,24 +48,7 @@ public Vector3 DimensionsIdx
4748
1000f / _data.Resolution.y,
4849
1000f / _data.Resolution.z); } }
4950

50-
/// <summary>
51-
/// The zero offset indicates the position of the (0,0,0) coordinate in the ReferenceAtlas
52-
/// relative to the world (0,0,0) coordinate.
53-
///
54-
/// It should be used by the W2A and A2W functions to transform coordinates
55-
/// </summary>
56-
public Vector3 ZeroOffset { get => _data.ZeroOffset; }
57-
58-
/// <summary>
59-
/// The reference coordinate is the point from which all transformed coordinates will be measured
60-
///
61-
/// For example, in the CCF this defaults to Bregma.
62-
/// </summary>
63-
public Vector3 ReferenceCoordinate
64-
{
65-
get => _data.ReferenceCoordinate;
66-
set => _data.ReferenceCoordinate = value;
67-
}
51+
public BGAtlasSpace AtlasSpace { get; private set; }
6852

6953
public Transform ParentT;
7054

@@ -107,6 +91,8 @@ public ReferenceAtlas(ReferenceAtlasData referenceAtlasData, Transform parentT,
10791
ParentT = parentT;
10892
_defaultMaterial = defaultMaterial;
10993

94+
AtlasSpace = new BGAtlasSpace(_data.name, _data.Dimensions);
95+
11096
Load_Deserialize();
11197

11298
if (loadAnnotations)
@@ -164,11 +150,11 @@ public async Task<int[,,]> LoadAnnotations()
164150
/// <summary>
165151
/// Move a coordinate from world space into the ReferenceAtlas space in um
166152
/// </summary>
167-
/// <param name="worldCoord"></param>
153+
/// <param name="coordWorld"></param>
168154
/// <returns></returns>
169-
public Vector3 World2Atlas(Vector3 worldCoord)
155+
public Vector3 World2Atlas(Vector3 coordWorld)
170156
{
171-
return World2Atlas_Vector(worldCoord + ReferenceCoordinate) - ZeroOffset;
157+
return AtlasSpace.World2Space(coordWorld);
172158
}
173159

174160
/// <summary>
@@ -188,7 +174,7 @@ public Vector3 World2AtlasIdx(Vector3 worldCoord)
188174
/// <returns></returns>
189175
public Vector3 Atlas2World(Vector3 atlasCoord)
190176
{
191-
return Atlas2World_Vector(atlasCoord + ZeroOffset) - ReferenceCoordinate;
177+
return AtlasSpace.Space2World(atlasCoord);
192178
}
193179

194180
public Vector3 AtlasIdx2World(Vector3 atlasIdxCoord)
@@ -199,11 +185,11 @@ public Vector3 AtlasIdx2World(Vector3 atlasIdxCoord)
199185
/// <summary>
200186
/// Rotate a normalized vector in the ReferenceAtlas space into world space
201187
/// </summary>
202-
/// <param name="normalizedAtlasVector"></param>
188+
/// <param name="vectorAtlas"></param>
203189
/// <returns></returns>
204-
public Vector3 Atlas2World_Vector(Vector3 normalizedAtlasVector)
190+
public Vector3 Atlas2World_Vector(Vector3 vectorAtlas)
205191
{
206-
return new Vector3(normalizedAtlasVector.y, -normalizedAtlasVector.z, -normalizedAtlasVector.x);
192+
return AtlasSpace.Space2World_Vector(vectorAtlas);
207193
}
208194

209195
/// <summary>
@@ -212,11 +198,11 @@ public Vector3 Atlas2World_Vector(Vector3 normalizedAtlasVector)
212198
///
213199
/// We define all reference atlases as being in (ap, ml, dv)
214200
/// </summary>
215-
/// <param name="normalizedWorldVector"></param>
201+
/// <param name="vectorWorld"></param>
216202
/// <returns></returns>
217-
public Vector3 World2Atlas_Vector(Vector3 normalizedWorldVector)
203+
public Vector3 World2Atlas_Vector(Vector3 vectorWorld)
218204
{
219-
return new Vector3(-normalizedWorldVector.z, normalizedWorldVector.x, -normalizedWorldVector.y);
205+
return AtlasSpace.World2Space_Vector(vectorWorld);
220206
}
221207

222208
public override string ToString()

Packages/vbl.brainatlas/Scripts/Runtime/Atlas/vbl.brainatlas.atlas.asmdef

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@
33
"rootNamespace": "",
44
"references": [
55
"GUID:7b654682f25e7af4abcebdc317baeea4",
6-
"GUID:d2f567832537619418d150dfbf265395"
6+
"GUID:d2f567832537619418d150dfbf265395",
7+
"GUID:1487851fb22c2cc4a85babd43c153c20"
78
],
89
"includePlatforms": [],
910
"excludePlatforms": [],

Packages/vbl.brainatlas/Scripts/Runtime/BrainAtlasManager.cs

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using BrainAtlas.ScriptableObjects;
2+
using BrainAtlas.CoordinateSystems;
23
using System;
34
using System.Collections.Generic;
45
using System.Threading.Tasks;
@@ -11,6 +12,9 @@ public class BrainAtlasManager : MonoBehaviour
1112
{
1213
#region Static
1314
public static BrainAtlasManager Instance;
15+
public static List<string> AtlasNames { get { return Instance._atlasMetaData.AtlasNames; } }
16+
public static Dictionary<string, Material> BrainRegionMaterials;
17+
public static Dictionary<string, AtlasTransform> AtlasTransforms;
1418
#endregion
1519

1620
#region Exposed
@@ -20,9 +24,6 @@ public class BrainAtlasManager : MonoBehaviour
2024

2125
#region Variables
2226
private AtlasMetaData _atlasMetaData;
23-
24-
public static List<string> AtlasNames { get { return Instance._atlasMetaData.AtlasNames; } }
25-
public static Dictionary<string, Material> BrainRegionMaterials;
2627
#endregion
2728

2829
#region Events
@@ -49,6 +50,9 @@ private void Awake()
4950
BrainRegionMaterials = new();
5051
for (int i = 0; i < _brainRegionMaterials.Count; i++)
5152
BrainRegionMaterials.Add(_brainRegionMaterialNames[i], _brainRegionMaterials[i]);
53+
54+
AtlasTransforms = new();
55+
AtlasTransforms.Add("null", new NullTransform());
5256
}
5357
#endregion
5458

@@ -85,6 +89,9 @@ public static async Task<ReferenceAtlas> LoadAtlas(string atlasName)
8589
Material defaultMaterial = BrainRegionMaterials["default"];
8690
Instance._referenceAtlas = new ReferenceAtlas(referenceAtlasDataTask.Result, Instance._parentGO.transform, defaultMaterial);
8791

92+
// Set the null transform
93+
ActiveAtlasTransform = AtlasTransforms["null"];
94+
8895
return Instance._referenceAtlas;
8996
}
9097
#endregion
@@ -98,14 +105,14 @@ public static async Task<ReferenceAtlas> LoadAtlas(string atlasName)
98105
/// <returns></returns>
99106
public static Vector3 WorldU2WorldT(Vector3 coordWorld)
100107
{
101-
return Instance._referenceAtlas.Atlas2World(Instance._atlasTransform.T2Atlas_Vector(
102-
Instance._atlasTransform.Atlas2T(Instance._referenceAtlas.World2Atlas(coordWorld))));
108+
return Instance._referenceAtlas.Atlas2World(Instance._atlasTransform.T2U_Vector(
109+
Instance._atlasTransform.U2T(Instance._referenceAtlas.World2Atlas(coordWorld))));
103110
}
104111

105112
public static Vector3 WorldT2WorldU(Vector3 coordWorldT)
106113
{
107-
return Instance._referenceAtlas.Atlas2World(Instance._atlasTransform.T2Atlas(
108-
Instance._atlasTransform.Atlas2T_Vector(Instance._referenceAtlas.World2Atlas(coordWorldT))));
114+
return Instance._referenceAtlas.Atlas2World(Instance._atlasTransform.T2U(
115+
Instance._atlasTransform.U2T_Vector(Instance._referenceAtlas.World2Atlas(coordWorldT))));
109116
}
110117

111118
/// <summary>
@@ -116,12 +123,12 @@ public static Vector3 WorldT2WorldU(Vector3 coordWorldT)
116123
/// <returns></returns>
117124
public static Vector3 World2T_Vector(Vector3 coordWorld)
118125
{
119-
return Instance._atlasTransform.Atlas2T_Vector(Instance._referenceAtlas.World2Atlas(coordWorld));
126+
return Instance._atlasTransform.U2T_Vector(Instance._referenceAtlas.World2Atlas(coordWorld));
120127
}
121128

122129
public static Vector3 T2World_Vector(Vector3 coordTransformed)
123130
{
124-
return Instance._referenceAtlas.Atlas2World(Instance._atlasTransform.T2Atlas_Vector(coordTransformed));
131+
return Instance._referenceAtlas.Atlas2World(Instance._atlasTransform.T2U_Vector(coordTransformed));
125132
}
126133
#endregion
127134

Packages/vbl.brainatlas/Scripts/Runtime/CoordinateSystems/AffineTransform.cs

Lines changed: 5 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using UnityEngine;
22

3-
namespace BrainAtlas
3+
namespace BrainAtlas.CoordinateSystems
44
{
55
public abstract class AffineTransform : AtlasTransform
66
{
@@ -23,49 +23,25 @@ public AffineTransform(Vector3 scaling, Vector3 rotation)
2323
_inverseRotation = Quaternion.Inverse(_rotation);
2424
}
2525

26-
/// <summary>
27-
/// Transform a coordinate by this AffineTransform
28-
/// </summary>
29-
/// <param name="ccfCoord"></param>
30-
/// <returns></returns>
31-
public override Vector3 Atlas2T(Vector3 ccfCoord)
26+
public override Vector3 U2T(Vector3 ccfCoord)
3227
{
3328
return Vector3.Scale(_rotation*ccfCoord, _scaling);
3429
}
3530

36-
/// <summary>
37-
/// Invert a coordinate from this AffineTransform back to it's CoordinateSpace
38-
/// </summary>
39-
/// <param name="coordTransformed"></param>
40-
/// <returns></returns>
41-
public override Vector3 T2Atlas(Vector3 coordTransformed)
31+
public override Vector3 T2U(Vector3 coordTransformed)
4232
{
4333
return _inverseRotation*Vector3.Scale(coordTransformed, _inverseScaling);
4434
}
4535

46-
/// <summary>
47-
/// Rotate any axes that have been flipped in the Transformed space
48-
///
49-
/// Note: this does **NOT** apply the AffineTransform rotation!
50-
/// </summary>
51-
/// <param name="coordSpace"></param>
52-
/// <returns></returns>
53-
public override Vector3 Atlas2T_Vector(Vector3 coordSpace)
36+
public override Vector3 U2T_Vector(Vector3 coordSpace)
5437
{
5538
return new Vector3(
5639
Mathf.Sign(_scaling.x) * coordSpace.x,
5740
Mathf.Sign(_scaling.y) * coordSpace.y,
5841
Mathf.Sign(_scaling.z) * coordSpace.z);
5942
}
6043

61-
/// <summary>
62-
/// Un-rotate any axes that have been flipped in the Transformed space
63-
///
64-
/// Note: this does **NOT** reverse the AffineTransform rotation!
65-
/// </summary>
66-
/// <param name="coordTransformed"></param>
67-
/// <returns></returns>
68-
public override Vector3 T2Atlas_Vector(Vector3 coordTransformed)
44+
public override Vector3 T2U_Vector(Vector3 coordTransformed)
6945
{
7046
return new Vector3(
7147
Mathf.Sign(_inverseScaling.x) * coordTransformed.x,

Packages/vbl.brainatlas/Scripts/Runtime/CoordinateSystems/AtlasTransform.cs

Lines changed: 7 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,71 +2,34 @@
22
using UnityEngine;
33

44

5-
namespace BrainAtlas
5+
namespace BrainAtlas.CoordinateSystems
66
{
7-
public abstract class AtlasTransform
7+
public abstract class AtlasTransform : CoordinateTransform
88
{
9-
public abstract string Name { get; }
10-
public abstract string Prefix { get; }
11-
12-
/// <summary>
13-
/// Convert a transformed atlas coordinate back to the un-transformed space
14-
/// </summary>
15-
/// <param name="atlasCoordT">Transformed coordinate</param>
16-
/// <returns></returns>
17-
public abstract Vector3 T2Atlas(Vector3 atlasCoordT);
18-
19-
/// <summary>
20-
/// Convert an atlas coordinate into a transformed space
21-
/// </summary>
22-
/// <param name="atlasCoordU">CCF coordinate in ap/dv/lr</param>
23-
/// <returns></returns>
24-
public abstract Vector3 Atlas2T(Vector3 atlasCoordU);
25-
26-
public abstract Vector3 T2Atlas_Vector(Vector3 normalizedAtlasVectorT);
27-
28-
public abstract Vector3 Atlas2T_Vector(Vector3 normalizedAtlasVectorU);
29-
30-
31-
public override string ToString()
32-
{
33-
return Name;
34-
}
35-
36-
public override bool Equals(object obj)
37-
{
38-
return obj is AtlasTransform transform &&
39-
Name == transform.Name;
40-
}
41-
42-
public override int GetHashCode()
43-
{
44-
return HashCode.Combine(Name);
45-
}
469
}
4710

4811
public class NullTransform : AtlasTransform
4912
{
5013
public override string Name => "null";
5114

52-
public override string Prefix => "0";
15+
public override string Prefix => "";
5316

54-
public override Vector3 Atlas2T(Vector3 atlasCoordU)
17+
public override Vector3 U2T(Vector3 atlasCoordU)
5518
{
5619
return atlasCoordU;
5720
}
5821

59-
public override Vector3 Atlas2T_Vector(Vector3 normalizedAtlasVectorU)
22+
public override Vector3 U2T_Vector(Vector3 normalizedAtlasVectorU)
6023
{
6124
return normalizedAtlasVectorU;
6225
}
6326

64-
public override Vector3 T2Atlas(Vector3 atlasCoordT)
27+
public override Vector3 T2U(Vector3 atlasCoordT)
6528
{
6629
return atlasCoordT;
6730
}
6831

69-
public override Vector3 T2Atlas_Vector(Vector3 normalizedAtlasVectorT)
32+
public override Vector3 T2U_Vector(Vector3 normalizedAtlasVectorT)
7033
{
7134
return normalizedAtlasVectorT;
7235
}

0 commit comments

Comments
 (0)