Пример #1
0
        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;
        }
Пример #2
0
        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;
            }
        }