private void Generate()
{
Julia julia = new Julia( global_real, global_imag, global_theta );
float scale = 2.5f;
float vcut = 29.0f;
float vscale = 1.0f / vcut;
HardwarePixelBuffer buffer = mPTex.GetBuffer( 0, 0 );
IntPtr Data = buffer.Lock( BufferLocking.Normal );
unsafe
{
PixelBox pb = buffer.CurrentLock;
int* pbptr = (int*)pb.Data.ToPointer();
for ( int z = pb.Front; z < pb.Back; z++ )
{
for ( int y = pb.Top; y < pb.Bottom; y++ )
{
for ( int x = pb.Left; x < pb.Right; x++ )
{
if ( z == pb.Front || z == ( pb.Back - 1 ) || y == pb.Top || y == ( pb.Bottom - 1 ) ||
x == pb.Left || x == ( pb.Right - 1 ) )
{
// On border, must be zero
pbptr[ x ] = 0;
}
else
{
float val = julia.eval( ( (float)x / pb.Width - 0.5f ) * scale,
( (float)y / pb.Height - 0.5f ) * scale,
( (float)z / pb.Depth - 0.5f ) * scale );
if ( val > vcut )
val = vcut;
ColorEx col = new ColorEx( ( 1.0f - ( val * vscale ) ) * 0.7f, (float)x / pb.Width, (float)y / pb.Height, (float)z / pb.Depth );
IntPtr vale = new IntPtr(pbptr + x );
PixelConverter.PackColor( col, PixelFormat.A8R8G8B8, vale );
}
}
pbptr += pb.RowPitch;
}
pbptr += pb.SliceSkip;
}
buffer.Unlock();
}
}