public void UpdateFromContext(VoxelStorageContext context, RenderVoxelVolumeData data) { VoxelMatrix = context.Matrix; var resolution = context.Resolution(); var maxRes = (double)Math.Max(resolution.X, Math.Max(resolution.Y, resolution.Z)); ClipMapCount = (int)Math.Log(maxRes / Math.Min(maxRes, (double)ClipResolution), 2) + 1; InnerClipMapScale = (float)Math.Pow(2, ClipMapCount - 1); ClipMapResolution = new Vector3(resolution.X, resolution.Y, resolution.Z) / InnerClipMapScale; var viewToTexTrans = Matrix.Translation(0.5f, 0.5f, 0.5f); var viewToTexScale = Matrix.Scaling(0.5f, 0.5f, 0.5f); Matrix BaseVoxelMatrix = VoxelMatrix; BaseVoxelMatrix.Invert(); BaseVoxelMatrix = BaseVoxelMatrix * Matrix.Scaling(2f, 2f, 2f); TextureMatrix = BaseVoxelMatrix * viewToTexScale * viewToTexTrans; InnerTextureMatrix = BaseVoxelMatrix * Matrix.Scaling(InnerClipMapScale) * viewToTexScale * viewToTexTrans; }
public void UpdateFromContext(VoxelStorageContext context) { var virtualResolution = context.Resolution(); var largestDimension = (double)Math.Max(virtualResolution.X, Math.Max(virtualResolution.Y, virtualResolution.Z)); ClipMapCount = (int)Math.Log(largestDimension / Math.Min(largestDimension, (double)ClipResolution), 2) + 1; ClipMapCurrent++; if (ClipMapCurrent >= ClipMapCount) { ClipMapCurrent = 0; } float FinestClipMapScale = (float)Math.Pow(2, ClipMapCount - 1); ClipMapResolution = new Vector3(virtualResolution.X, virtualResolution.Y, virtualResolution.Z) / FinestClipMapScale; MipMapCount = (int)Math.Floor(Math.Log(Math.Min(ClipMapResolution.X, Math.Min(ClipMapResolution.Y, ClipMapResolution.Z)), 2)); int voxelScale = 1; for (int i = 0; i < (ClipMapCount + MipMapCount); i++) { Vector3 SnappedVolumeTranslation = context.VoxelSpaceTranslation; SnappedVolumeTranslation.X = (float)Math.Floor(SnappedVolumeTranslation.X / voxelScale) * voxelScale; SnappedVolumeTranslation.Y = (float)Math.Floor(SnappedVolumeTranslation.Y / voxelScale) * voxelScale; SnappedVolumeTranslation.Z = (float)Math.Floor(SnappedVolumeTranslation.Z / voxelScale) * voxelScale; if (ShouldUpdateClipIndex(i)) { PerMapSnappingOffset[i] = -SnappedVolumeTranslation *context.RealVoxelSize(); MippingOffsetTranslation[i] = new Int3((int)SnappedVolumeTranslation.X, (int)SnappedVolumeTranslation.Y, (int)SnappedVolumeTranslation.Z); } voxelScale *= 2; } float extentScale = (float)Math.Pow(2f, ClipMapCount - 1); voxelScale = 1; for (int i = 0; i < (ClipMapCount + MipMapCount); i++) { if (ShouldUpdateClipIndex(i)) { Vector3 offset = (PerMapSnappingOffset[i]) * extentScale / context.Extents + 0.5f; PerMapOffsetScale[i] = new Vector4(offset, (1.0f / context.Extents.X) * extentScale); } if (i + 1 == ClipMapCurrent || ShouldUpdateClipIndex(i)) { MippingOffset[i] = (Vector3)((MippingOffsetTranslation[i] - MippingOffsetTranslation[i + 1]) / voxelScale); } if (i < ClipMapCount - 1) { extentScale /= 2; } voxelScale *= 2; } }