using System;
using [Link];
using UnityEngine;
namespace UnityVolumeRendering
{
public class VolumeObjectFactory
{
public static VolumeRenderedObject CreateObject(VolumeDataset dataset)
{
GameObject outerObject = new GameObject("VolumeRenderedObject_" +
[Link]);
VolumeRenderedObject volObj =
[Link]<VolumeRenderedObject>();
GameObject meshContainer =
[Link]((GameObject)[Link]("VolumeContainer"));
[Link] = meshContainer;
MeshRenderer meshRenderer = [Link]<MeshRenderer>();
CreateObjectInternal(dataset, meshContainer, meshRenderer, volObj,
outerObject);
[Link]("_DataTex",
[Link]());
return volObj;
}
public static async Task<VolumeRenderedObject>
CreateObjectAsync(VolumeDataset dataset, IProgressHandler progressHandler = null)
{
GameObject outerObject = new GameObject("VolumeRenderedObject_" +
[Link]);
VolumeRenderedObject volObj =
[Link]<VolumeRenderedObject>();
GameObject meshContainer =
[Link]((GameObject)[Link]("VolumeContainer"));
[Link] = meshContainer;
MeshRenderer meshRenderer = [Link]<MeshRenderer>();
CreateObjectInternal(dataset,meshContainer,
meshRenderer,volObj,outerObject) ;
[Link]("_DataTex", await
[Link](progressHandler));
return volObj;
}
private static void CreateObjectInternal(VolumeDataset dataset, GameObject
meshContainer, MeshRenderer meshRenderer, VolumeRenderedObject volObj, GameObject
outerObject, IProgressHandler progressHandler = null)
{
[Link] = [Link];
[Link] = [Link];
[Link] = [Link];
[Link] = [Link];
[Link] = [Link](0.0f, 0.0f,
0.0f);
[Link] = new
Material([Link]);
[Link] = meshRenderer;
[Link] = dataset;
const int noiseDimX = 512;
const int noiseDimY = 512;
Texture2D noiseTexture =
[Link](noiseDimX, noiseDimY);
TransferFunction tf =
[Link]();
Texture2D tfTexture = [Link]();
[Link] = tf;
TransferFunction2D tf2D =
TransferFunctionDatabase.CreateTransferFunction2D();
volObj.transferFunction2D = tf2D;
[Link]("_GradientTex", null);
[Link]("_NoiseTex", noiseTexture);
[Link]("_TFTex", tfTexture);
[Link]("MODE_DVR");
[Link]("MODE_MIP");
[Link]("MODE_SURF");
[Link] = [Link];
[Link] = [Link];
// Normalise size (TODO: Add setting for diabling this?)
float maxScale = [Link]([Link].x, [Link].y,
[Link].z);
[Link] = [Link] / maxScale;
}
public static void SpawnCrossSectionPlane(VolumeRenderedObject volobj)
{
GameObject quad =
[Link]((GameObject)[Link]("CrossSectionPlane"));
[Link] = [Link](270.0f, 0.0f, 0.0f);
CrossSectionPlane csplane =
[Link]<CrossSectionPlane>();
[Link](volobj);
[Link] = [Link];
#if UNITY_EDITOR
[Link] = new [Link][] { quad };
#endif
}
public static void SpawnCutoutBox(VolumeRenderedObject volobj)
{
GameObject obj =
[Link]((GameObject)[Link]("CutoutBox"));
[Link] = [Link](270.0f, 0.0f, 0.0f);
CutoutBox cbox = [Link]<CutoutBox>();
[Link](volobj);
[Link] = [Link];
#if UNITY_EDITOR
[Link] = new [Link][] { obj };
#endif
}
public static void SpawnCutoutSphere(VolumeRenderedObject volobj)
{
GameObject obj =
[Link]((GameObject)[Link]("CutoutSphere"));
[Link] = [Link](270.0f, 0.0f, 0.0f);
CutoutSphere cSphere = [Link]<CutoutSphere>();
[Link](volobj);
[Link] = [Link];
#if UNITY_EDITOR
[Link] = new [Link][] { obj };
#endif
}
}
}