Skip to content

Commit a7daad2

Browse files
committed
Added endianness-setting to raw dataset importer
1 parent 5af2d82 commit a7daad2

File tree

4 files changed

+95
-30
lines changed

4 files changed

+95
-30
lines changed

Assets/Editor/DatasetImporterEditorWIndow.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ private enum DatasetType
2222
private int dimZ; // TODO: set good default value
2323
private int bytesToSkip = 0;
2424
private DataContentFormat dataFormat = DataContentFormat.Int16;
25+
private Endianness endianness = Endianness.LittleEndian;
2526

2627
public DatasetImporterEditorWindow(string fileToImport)
2728
{
@@ -50,6 +51,7 @@ public DatasetImporterEditorWindow(string fileToImport)
5051
dimZ = initData.dimZ;
5152
bytesToSkip = initData.bytesToSkip;
5253
dataFormat = initData.format;
54+
endianness = initData.endianness;
5355
}
5456

5557
this.minSize = new Vector2(300.0f, 200.0f);
@@ -62,7 +64,7 @@ private void ImportDataset()
6264
{
6365
case DatasetType.Raw:
6466
{
65-
importer = new RawDatasetImporter(fileToImport, dimX, dimY, dimZ, dataFormat, bytesToSkip);
67+
importer = new RawDatasetImporter(fileToImport, dimX, dimY, dimZ, dataFormat, endianness, bytesToSkip);
6668
break;
6769
}
6870
case DatasetType.DICOM:
@@ -99,6 +101,7 @@ private void OnGUI()
99101
dimZ = EditorGUILayout.IntField("Z dimension", dimZ);
100102
bytesToSkip = EditorGUILayout.IntField("Bytes to skip", bytesToSkip);
101103
dataFormat = (DataContentFormat)EditorGUILayout.EnumPopup("Data format", dataFormat);
104+
endianness = (Endianness)EditorGUILayout.EnumPopup("Endianness", endianness);
102105
break;
103106
}
104107
}

Assets/Scripts/Importing/DatasetIniReader.cs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class DatasetIniData
1010
public int dimZ = 0;
1111
public int bytesToSkip = 0;
1212
public DataContentFormat format = DataContentFormat.Uint8;
13+
public Endianness endianness = Endianness.LittleEndian;
1314
}
1415

1516
public class DatasetIniReader
@@ -41,9 +42,9 @@ public static DatasetIniData ParseIniFile(string filePath)
4142
else if (name == "skip")
4243
Int32.TryParse(value, out iniData.bytesToSkip);
4344
else if (name == "format")
44-
{
4545
iniData.format = GetFormatByName(value);
46-
}
46+
else if (name == "endianness")
47+
iniData.endianness = GetEndiannessByName(value);
4748
}
4849

4950
return iniData;
@@ -69,5 +70,18 @@ private static DataContentFormat GetFormatByName(string format)
6970
return DataContentFormat.Uint8;
7071
}
7172
}
73+
74+
private static Endianness GetEndiannessByName(string name)
75+
{
76+
switch (name)
77+
{
78+
case "bigendian":
79+
return Endianness.BigEndian;
80+
case "littleendian":
81+
return Endianness.LittleEndian;
82+
default:
83+
return Endianness.LittleEndian;
84+
}
85+
}
7286
}
7387
}

Assets/Scripts/Importing/RawDatasetImporter.cs

Lines changed: 73 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,30 @@ public enum DataContentFormat
1414
Uint32
1515
}
1616

17+
public enum Endianness
18+
{
19+
LittleEndian,
20+
BigEndian
21+
}
22+
1723
public class RawDatasetImporter : DatasetImporterBase
1824
{
1925
string filePath;
2026
private int dimX;
2127
private int dimY;
2228
private int dimZ;
2329
private DataContentFormat contentFormat;
24-
int skipBytes;
30+
private Endianness endianness;
31+
private int skipBytes;
2532

26-
public RawDatasetImporter(string filePath, int dimX, int dimY, int dimZ, DataContentFormat contentFormat, int skipBytes)
33+
public RawDatasetImporter(string filePath, int dimX, int dimY, int dimZ, DataContentFormat contentFormat, Endianness endianness, int skipBytes)
2734
{
2835
this.filePath = filePath;
2936
this.dimX = dimX;
3037
this.dimY = dimY;
3138
this.dimZ = dimZ;
3239
this.contentFormat = contentFormat;
40+
this.endianness = endianness;
3341
this.skipBytes = skipBytes;
3442
}
3543

@@ -68,31 +76,9 @@ public override VolumeDataset Import()
6876
dataset.data = new int[uDimension];
6977

7078
// Read the data/sample values
71-
int val = 0;
7279
for (int i = 0; i < uDimension; i++)
7380
{
74-
switch (contentFormat)
75-
{
76-
case DataContentFormat.Int8:
77-
val = (int)reader.ReadSByte();
78-
break;
79-
case DataContentFormat.Int16:
80-
val = (int)reader.ReadInt16();
81-
break;
82-
case DataContentFormat.Int32:
83-
val = (int)reader.ReadInt32();
84-
break;
85-
case DataContentFormat.Uint8:
86-
val = (int)reader.ReadByte();
87-
break;
88-
case DataContentFormat.Uint16:
89-
val = (int)reader.ReadUInt16();
90-
break;
91-
case DataContentFormat.Uint32:
92-
val = (int)reader.ReadUInt32();
93-
break;
94-
}
95-
dataset.data[i] = val;
81+
dataset.data[i] = ReadDataValue(reader);
9682
}
9783
Debug.Log("Loaded dataset in range: " + dataset.GetMinDataValue() + " - " + dataset.GetMaxDataValue());
9884

@@ -101,6 +87,68 @@ public override VolumeDataset Import()
10187
return dataset;
10288
}
10389

90+
private int ReadDataValue(BinaryReader reader)
91+
{
92+
switch (contentFormat)
93+
{
94+
case DataContentFormat.Int8:
95+
{
96+
sbyte dataval = reader.ReadSByte();
97+
return (int)dataval;
98+
}
99+
case DataContentFormat.Int16:
100+
{
101+
short dataval = reader.ReadInt16();
102+
if (endianness == Endianness.BigEndian)
103+
{
104+
byte[] bytes = BitConverter.GetBytes(dataval);
105+
Array.Reverse(bytes, 0, bytes.Length);
106+
dataval = BitConverter.ToInt16(bytes, 0);
107+
}
108+
return (int)dataval;
109+
}
110+
case DataContentFormat.Int32:
111+
{
112+
int dataval = reader.ReadInt32();
113+
if (endianness == Endianness.BigEndian)
114+
{
115+
byte[] bytes = BitConverter.GetBytes(dataval);
116+
Array.Reverse(bytes, 0, bytes.Length);
117+
dataval = BitConverter.ToInt32(bytes, 0);
118+
}
119+
return (int)dataval;
120+
}
121+
case DataContentFormat.Uint8:
122+
{
123+
return (int)reader.ReadByte();
124+
}
125+
case DataContentFormat.Uint16:
126+
{
127+
ushort dataval = reader.ReadUInt16();
128+
if (endianness == Endianness.BigEndian)
129+
{
130+
byte[] bytes = BitConverter.GetBytes(dataval);
131+
Array.Reverse(bytes, 0, bytes.Length);
132+
dataval = BitConverter.ToUInt16(bytes, 0);
133+
}
134+
return (int)dataval;
135+
}
136+
case DataContentFormat.Uint32:
137+
{
138+
uint dataval = reader.ReadUInt32();
139+
if (endianness == Endianness.BigEndian)
140+
{
141+
byte[] bytes = BitConverter.GetBytes(dataval);
142+
Array.Reverse(bytes, 0, bytes.Length);
143+
dataval = BitConverter.ToUInt32(bytes, 0);
144+
}
145+
return (int)dataval;
146+
}
147+
default:
148+
throw new NotImplementedException("Unimplemented data content format");
149+
}
150+
}
151+
104152
private int GetSampleFormatSize(DataContentFormat format)
105153
{
106154
switch (format)

Assets/Scripts/VolumeObject/VolumeRenderedObject.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ public void SetRenderMode(RenderMode mode)
5252
public void SetTransferFunctionMode(TFRenderMode mode)
5353
{
5454
tfRenderMode = mode;
55-
if (tfRenderMode == TFRenderMode.TF1D)
55+
if (tfRenderMode == TFRenderMode.TF1D && transferFunction != null)
5656
transferFunction.GenerateTexture();
57-
else
57+
else if(transferFunction2D != null)
5858
transferFunction2D.GenerateTexture();
5959
UpdateMaaterialProperties();
6060
}

0 commit comments

Comments
 (0)