Exemplo n.º 1
0
        DataStream_p3s_c4b_t2s Fix_p3s_c4b_t2s(DataStream_p3s_c4b_t2s p3s_c4b_t2s, Vector3 bboxMin, Vector3 bboxMax)
        {
            for (int i = 0; i < p3s_c4b_t2s.p3s_c4b_t2sElem.Count; i++)
            {
                float multiplerX = Math.Abs(bboxMin.X - bboxMax.X) / 2f;
                float multiplerY = Math.Abs(bboxMin.Y - bboxMax.Y) / 2f;
                float multiplerZ = Math.Abs(bboxMin.Z - bboxMax.Z) / 2f;
                if (multiplerX < 1)
                {
                    multiplerX = 1;
                }
                if (multiplerY < 1)
                {
                    multiplerY = 1;
                }
                if (multiplerZ < 1)
                {
                    multiplerZ = 1;
                }

                short shortPosX = Utils.EvilConverter.Convert(p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[0]);
                short shortPosY = Utils.EvilConverter.Convert(p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[1]);
                short shortPosZ = Utils.EvilConverter.Convert(p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[2]);
                short shortPosW = Utils.EvilConverter.Convert(p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[3]);

                p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[0] = HalfHelper.SingleToHalf(Utils.tPackB2F(shortPosX) * multiplerX + (bboxMax.X + bboxMin.X) / 2).value;
                p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[1] = HalfHelper.SingleToHalf(Utils.tPackB2F(shortPosY) * multiplerY + (bboxMax.Y + bboxMin.Y) / 2).value;
                p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[2] = HalfHelper.SingleToHalf(Utils.tPackB2F(shortPosZ) * multiplerZ + (bboxMax.Z + bboxMin.Z) / 2).value;
                p3s_c4b_t2s.p3s_c4b_t2sElem[i].pos[3] = HalfHelper.SingleToHalf(Utils.tPackB2F(shortPosW)).value;
            }
            return(p3s_c4b_t2s);
        }
Exemplo n.º 2
0
        private static void WriteHalf(byte[] output, int pos, byte value)
        {
            float  single = value / 255.0f;
            ushort half   = HalfHelper.SingleToHalf(single);

            output[pos + 0] = (byte)half;
            output[pos + 1] = (byte)(half >> 8);
        }
Exemplo n.º 3
0
 public Half ReadHalf()
 {
     byte[] f = new byte[4];
     byte[] h = this.ReadBytes(2);
     f[2] = h[0];
     f[3] = h[1];
     return(HalfHelper.SingleToHalf(EndianBitConverter.Little.ToSingle(f, 0)));
     //return Half.ToHalf(this.ReadBytes(2), 0);
 }
Exemplo n.º 4
0
        public static UInt16 fixVert(ushort uInt16)
        {
            //float normFloat = toInt(uInt16) / 256f / 128;
            //var bytes = BitConverter.GetBytes(normFloat);
            //return SingleToHalf(BitConverter.ToInt32(bytes,0));
            float normFloat = byte2hexIntFracToFloat3(uInt16);
            Half  halfFloat;

            halfFloat = HalfHelper.SingleToHalf(normFloat);
            return(halfFloat.value);
        }
Exemplo n.º 5
0
    //  From GX-Encino Waves
    private void Butterfly()
    {
        int log2Size = Mathf.RoundToInt(Mathf.Log(mapSize, 2));

        var butterflyData = new Vector2[mapSize * log2Size];

        int offset = 1, numIterations = mapSize >> 1;

        for (int rowIndex = 0; rowIndex < log2Size; rowIndex++)
        {
            int rowOffset = rowIndex * mapSize;

            // Weights
            {
                int start = 0, end = 2 * offset;
                for (int iteration = 0; iteration < numIterations; iteration++)
                {
                    float bigK = 0.0f;
                    for (int K = start; K < end; K += 2)
                    {
                        float phase = 2.0f * Mathf.PI * bigK * numIterations / mapSize;
                        float cos   = Mathf.Cos(phase);
                        float sin   = Mathf.Sin(phase);

                        butterflyData[rowOffset + K / 2].x = cos;
                        butterflyData[rowOffset + K / 2].y = -sin;

                        butterflyData[rowOffset + K / 2 + offset].x = -cos;
                        butterflyData[rowOffset + K / 2 + offset].y = sin;

                        bigK += 1.0f;
                    }
                    start += 4 * offset;
                    end    = start + 2 * offset;
                }
            }

            numIterations >>= 1;
            offset        <<= 1;
        }

        var butterflyBytes = new byte[butterflyData.Length * sizeof(ushort) * 2];

        for (uint i = 0; i < butterflyData.Length; i++)
        {
            uint byteOffset = i * sizeof(ushort) * 2;
            HalfHelper.SingleToHalf(butterflyData[i].x, butterflyBytes, byteOffset);
            HalfHelper.SingleToHalf(butterflyData[i].y, butterflyBytes, byteOffset + sizeof(ushort));
        }

        texButterfly = new Texture2D(mapSize, log2Size, TextureFormat.RGHalf, false);
        texButterfly.LoadRawTextureData(butterflyBytes);
        texButterfly.Apply(false, true);
    }
Exemplo n.º 6
0
        DataStream_p3s_c4b_t2s Fix_p3f_c4b_t2s(DataStream_p3f_c4b_t2s p3f_c4b_t2s)
        {
            DataStream_p3s_c4b_t2s p3s_c4b_t2s = new DataStream_p3s_c4b_t2s();

            for (int i = 0; i < p3f_c4b_t2s.p3f_c4b_t2sElem.Count; i++)
            {
                DataStream_p3s_c4b_t2s_Elem elem = new DataStream_p3s_c4b_t2s_Elem();
                elem.bgra = p3f_c4b_t2s.p3f_c4b_t2sElem[i].bgra;
                elem.uv   = p3f_c4b_t2s.p3f_c4b_t2sElem[i].uv;

                elem.pos[0] = HalfHelper.SingleToHalf(p3f_c4b_t2s.p3f_c4b_t2sElem[i].pos[0]).value;
                elem.pos[1] = HalfHelper.SingleToHalf(p3f_c4b_t2s.p3f_c4b_t2sElem[i].pos[1]).value;
                elem.pos[2] = HalfHelper.SingleToHalf(p3f_c4b_t2s.p3f_c4b_t2sElem[i].pos[2]).value;
                elem.pos[3] = HalfHelper.SingleToHalf(1.0f).value;

                p3s_c4b_t2s.p3s_c4b_t2sElem.Add(elem);
            }
            return(p3s_c4b_t2s);
        }
Exemplo n.º 7
0
 public Voxel(float density = -1.0f)
 {
     _densityHalf = HalfHelper.SingleToHalf(density);
 }
Exemplo n.º 8
0
    void OnEnable()
    {
        shaderSpectrum       = (ComputeShader)Resources.Load("EncinoSpectrum", typeof(ComputeShader));
        kernelSpectrumInit   = shaderSpectrum.FindKernel("EncinoSpectrumInit");
        kernelSpectrumUpdate = shaderSpectrum.FindKernel("EncinoSpectrumUpdate");
        shaderFFT            = (ComputeShader)Resources.Load("EncinoFFT", typeof(ComputeShader));
        materialCombine      = (Material)Resources.Load("EncinoCombine", typeof(Material));

        bufferFFTTemp = new RenderTexture(size, size, 0, RenderTextureFormat.RGFloat);
        bufferFFTTemp.enableRandomWrite = true;
        bufferFFTTemp.Create();

        bufferSpectrumH0 = new RenderTexture(size, size, 0, RenderTextureFormat.ARGBFloat);
        bufferSpectrumH0.enableRandomWrite = true;
        bufferSpectrumH0.Create();

        bufferSpectrumH    = CreateSpectrumUAV();
        bufferSpectrumDx   = CreateSpectrumUAV();
        bufferSpectrumDy   = CreateSpectrumUAV();
        bufferHFinal       = CreateFinalTexture();
        bufferDxFinal      = CreateFinalTexture();
        bufferDyFinal      = CreateFinalTexture();
        bufferDisplacement = CreateCombinedTexture();
        bufferGradientFold = CreateCombinedTexture();

        // Butterfly
        {
            int log2Size = Mathf.RoundToInt(Mathf.Log(size, 2));

            var butterflyData = new Vector2[size * log2Size];

            int offset = 1, numIterations = size >> 1;
            for (int rowIndex = 0; rowIndex < log2Size; rowIndex++)
            {
                int rowOffset = rowIndex * size;

                // Weights
                {
                    int start = 0, end = 2 * offset;
                    for (int iteration = 0; iteration < numIterations; iteration++)
                    {
                        float bigK = 0.0f;
                        for (int K = start; K < end; K += 2)
                        {
                            float phase = 2.0f * Mathf.PI * bigK * numIterations / size;
                            float cos   = Mathf.Cos(phase);
                            float sin   = Mathf.Sin(phase);

                            butterflyData[rowOffset + K / 2].x = cos;
                            butterflyData[rowOffset + K / 2].y = -sin;

                            butterflyData[rowOffset + K / 2 + offset].x = -cos;
                            butterflyData[rowOffset + K / 2 + offset].y = sin;

                            bigK += 1.0f;
                        }
                        start += 4 * offset;
                        end    = start + 2 * offset;
                    }
                }

                numIterations >>= 1;
                offset        <<= 1;
            }

            var butterflyBytes = new byte[butterflyData.Length * sizeof(ushort) * 2];
            for (uint i = 0; i < butterflyData.Length; i++)
            {
                uint byteOffset = i * sizeof(ushort) * 2;
                HalfHelper.SingleToHalf(butterflyData[i].x, butterflyBytes, byteOffset);
                HalfHelper.SingleToHalf(butterflyData[i].y, butterflyBytes, byteOffset + sizeof(ushort));
            }

            texButterfly = new Texture2D(size, log2Size, TextureFormat.RGHalf, false);
            texButterfly.LoadRawTextureData(butterflyBytes);
            texButterfly.Apply(false, true);
        }

        // Kernel offset
        {
            int baseLog2Size = Mathf.RoundToInt(Mathf.Log(256, 2));
            int log2Size     = Mathf.RoundToInt(Mathf.Log(size, 2));
            kernelFFTX = (log2Size - baseLog2Size) * 2;
            kernelFFTY = kernelFFTX + 1;
        }

        // Mesh
        {
            mesh      = new Mesh();
            mesh.name = "EncinoMesh";

            float spacing = 1.0f / meshSize;
            var   offset  = new Vector3(-0.5f, 0.0f, -0.5f);

            var vertices = new List <Vector3>();
            var uvs      = new List <Vector2>();
            for (int y = 0; y <= meshSize; y++)
            {
                for (int x = 0; x <= meshSize; x++)
                {
                    vertices.Add(offset + new Vector3(x * spacing, 0.0f, y * spacing));
                    uvs.Add(new Vector2((float)x / meshSize, (float)y / meshSize));
                }
                for (int x = 0; x < meshSize; x++)
                {
                    if (y < meshSize)
                    {
                        vertices.Add(offset + new Vector3((x + 0.5f) * spacing, 0.0f, (y + 0.5f) * spacing));
                        uvs.Add(new Vector2((float)(x + 0.5f) / meshSize, (float)(y + 0.5f) / meshSize));
                    }
                }
            }

            var triangles = new List <int>();
            for (int y = 0; y < meshSize; y++)
            {
                for (int x = 0; x < meshSize; x++)
                {
                    var i0 = y * (meshSize * 2 + 1) + x;
                    var i1 = i0 + 1;
                    var i2 = i0 + (meshSize * 2) + 1;
                    var i3 = i2 + 1;
                    var ic = i0 + meshSize + 1;

                    triangles.Add(i1);
                    triangles.Add(i0);
                    triangles.Add(ic);

                    triangles.Add(i1);
                    triangles.Add(ic);
                    triangles.Add(i3);

                    triangles.Add(ic);
                    triangles.Add(i2);
                    triangles.Add(i3);

                    triangles.Add(i0);
                    triangles.Add(i2);
                    triangles.Add(ic);
                }
            }

            mesh.vertices  = vertices.ToArray();
            mesh.uv        = uvs.ToArray();
            mesh.triangles = triangles.ToArray();
            mesh.UploadMeshData(false);
            mesh.RecalculateNormals();
        }
    }
Exemplo n.º 9
0
 /// <summary>
 /// Read UVVector2 from file as floats.
 /// </summary>
 /// <param name="reader"></param>
 public void ReadFromFile(BinaryReader reader)
 {
     X = HalfHelper.SingleToHalf(reader.ReadSingle());
     Y = HalfHelper.SingleToHalf(reader.ReadSingle());
 }