Skip to content

Commit 9d8dd89

Browse files
authored
Fix prefab saving when overwriting existing prefab (don't duplicate objects) (mlavik1#236)
- Fix prefab saving when overwriting existing prefab (don't duplicate objects) - Don't keep volume texture data after uploading to GPU - Make sure volume data texture always is in sync on material
1 parent 25772d9 commit 9d8dd89

File tree

3 files changed

+46
-17
lines changed

3 files changed

+46
-17
lines changed

Assets/Editor/DragDropHandler.cs

Lines changed: 36 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,17 +84,44 @@ private static DragAndDropVisualMode OnProjectBrowserDrop(int dragInstanceId, st
8484
{
8585
VolumeRenderedObject srcVolRendObj = volRendObjects[i];
8686
VolumeRenderedObject prefabVolRendObj = prefabVolRendObjects[i];
87-
VolumeDataset dataset = ScriptableObject.Instantiate(srcVolRendObj.dataset);
88-
TransferFunction transferFunction = ScriptableObject.Instantiate(srcVolRendObj.transferFunction);
89-
Material material = Material.Instantiate(srcVolRendObj.meshRenderer.sharedMaterial);
90-
AssetDatabase.AddObjectToAsset(dataset, prefab);
91-
AssetDatabase.AddObjectToAsset(transferFunction, prefab);
92-
AssetDatabase.AddObjectToAsset(material, prefab);
93-
prefabVolRendObj.dataset = dataset;
94-
prefabVolRendObj.transferFunction = transferFunction;
95-
prefabVolRendObj.meshRenderer.material = material;
87+
if (srcVolRendObj.dataset != prefabVolRendObj.dataset)
88+
{
89+
// Dataset changed => remove old one form asset to avoid wasting space
90+
if (prefabVolRendObj.dataset != null)
91+
AssetDatabase.RemoveObjectFromAsset(prefabVolRendObj.dataset);
92+
VolumeDataset dataset = ScriptableObject.Instantiate(srcVolRendObj.dataset);
93+
AssetDatabase.AddObjectToAsset(dataset, prefab);
94+
prefabVolRendObj.dataset = dataset;
95+
}
96+
if (srcVolRendObj.transferFunction != prefabVolRendObj.transferFunction)
97+
{
98+
if (prefabVolRendObj.transferFunction != null)
99+
AssetDatabase.RemoveObjectFromAsset(prefabVolRendObj.transferFunction);
100+
TransferFunction transferFunction = ScriptableObject.Instantiate(srcVolRendObj.transferFunction);
101+
AssetDatabase.AddObjectToAsset(transferFunction, prefab);
102+
prefabVolRendObj.transferFunction = transferFunction;
103+
}
104+
if (srcVolRendObj.meshRenderer.sharedMaterial != prefabVolRendObj.meshRenderer.sharedMaterial)
105+
{
106+
if (prefabVolRendObj.meshRenderer.sharedMaterial != null)
107+
AssetDatabase.RemoveObjectFromAsset(prefabVolRendObj.meshRenderer.sharedMaterial);
108+
Material material = Material.Instantiate(srcVolRendObj.meshRenderer.sharedMaterial);
109+
AssetDatabase.AddObjectToAsset(material, prefab);
110+
prefabVolRendObj.meshRenderer.material = material;
111+
}
96112
}
97113
PrefabUtility.SavePrefabAsset(prefab);
114+
for (int i = 0; i < volRendObjects.Length; i++)
115+
{
116+
VolumeRenderedObject srcVolRendObj = volRendObjects[i];
117+
VolumeRenderedObject prefabVolRendObj = prefabVolRendObjects[i];
118+
if (!AssetDatabase.Contains(srcVolRendObj.dataset))
119+
ScriptableObject.DestroyImmediate(srcVolRendObj.dataset);
120+
srcVolRendObj.dataset = prefabVolRendObj.dataset;
121+
srcVolRendObj.transferFunction = prefabVolRendObj.transferFunction;
122+
srcVolRendObj.meshRenderer.sharedMaterial = prefabVolRendObj.meshRenderer.sharedMaterial;
123+
srcVolRendObj.UpdateMaterialProperties();
124+
}
98125
}
99126

100127
return DragAndDropVisualMode.Copy;

Assets/Scripts/VolumeData/VolumeDataset.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ await Task.Run(() => {
274274
texture = new Texture3D(dimX, dimY, dimZ, texformat, false);
275275
texture.wrapMode = TextureWrapMode.Clamp;
276276
texture.SetPixelData(pixelBytes, 0);
277-
texture.Apply();
277+
texture.Apply(false, true);
278278
dataTexture = texture;
279279
pixelBytes.Dispose();
280280
}
@@ -299,7 +299,7 @@ await Task.Run(() => {
299299
texture = new Texture3D(dimX, dimY, dimZ, texformat, false);
300300
texture.wrapMode = TextureWrapMode.Clamp;
301301
texture.SetPixelData(pixelBytes, 0);
302-
texture.Apply();
302+
texture.Apply(false, true);
303303
pixelBytes.Dispose();
304304
}
305305
}
@@ -315,7 +315,7 @@ await Task.Run(() => {
315315
for (int z = 0; z < dimZ; z++)
316316
texture.SetPixel(x, y, z, new Color((float)(data[x + y * dimX + z * (dimX * dimY)] - minValue) / maxRange, 0.0f, 0.0f, 0.0f));
317317

318-
texture.Apply();
318+
texture.Apply(false, true);
319319
}
320320
progressHandler.EndStage();
321321
Debug.Log("Texture generation done.");
@@ -370,7 +370,7 @@ await Task.Run(() => {
370370
}
371371
progressHandler.EndStage();
372372
progressHandler.StartStage(0.2f, "Uploading gradient texture");
373-
textureTmp.Apply();
373+
textureTmp.Apply(false, true);
374374

375375
progressHandler.EndStage();
376376
Debug.Log("Gradient gereneration done.");
@@ -401,7 +401,7 @@ await Task.Run(() => {
401401
Texture3D texture = new Texture3D(dimX, dimY, dimZ, texformat, false);
402402
texture.wrapMode = TextureWrapMode.Clamp;
403403
texture.SetPixels(cols);
404-
texture.Apply();
404+
texture.Apply(false, true);
405405
progressHandler.EndStage();
406406

407407
Debug.Log("Gradient gereneration done.");

Assets/Scripts/VolumeObject/VolumeRenderedObject.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -281,7 +281,7 @@ public async Task SetTransferFunctionAsync(TransferFunction tf, IProgressHandler
281281
await UpdateMaterialPropertiesAsync(progressHandler);
282282
}
283283

284-
private void UpdateMaterialProperties(IProgressHandler progressHandler = null)
284+
public void UpdateMaterialProperties(IProgressHandler progressHandler = null)
285285
{
286286
Task task = UpdateMaterialPropertiesAsync(progressHandler);
287287
}
@@ -293,8 +293,10 @@ private async Task UpdateMaterialPropertiesAsync(IProgressHandler progressHandle
293293
try
294294
{
295295
bool useGradientTexture = tfRenderMode == TFRenderMode.TF2D || renderMode == RenderMode.IsosurfaceRendering || lightingEnabled;
296-
Texture3D texture = useGradientTexture ? await dataset.GetGradientTextureAsync(progressHandler) : null;
297-
meshRenderer.sharedMaterial.SetTexture("_GradientTex", texture);
296+
Texture3D gradientTexture = useGradientTexture ? await dataset.GetGradientTextureAsync(progressHandler) : null;
297+
Texture3D dataTexture = await dataset.GetDataTextureAsync(progressHandler);
298+
meshRenderer.sharedMaterial.SetTexture("_DataTex", dataTexture);
299+
meshRenderer.sharedMaterial.SetTexture("_GradientTex", gradientTexture);
298300
UpdateMatInternal();
299301
}
300302
finally

0 commit comments

Comments
 (0)