예제 #1
0
    public static shvectorrgb operator +(shvectorrgb a, shvectorrgb b)
    {
        shvectorrgb ret = new shvectorrgb();

        ret.r = a.r + b.r;
        ret.g = a.g + b.g;
        ret.b = a.b + b.b;

        return(ret);
    }
예제 #2
0
    unsafe static public void CreateProbeVisualization(GIVolumeSHData[] shdata)
    {
        //instance rendering
        MaterialPropertyBlock props = new MaterialPropertyBlock();
        MeshRenderer          renderer;

        Shader   probe_inst_shader = Shader.Find("Unlit/LightProbeInstShader");
        Material inst_mat          = new Material(probe_inst_shader);

        inst_mat.enableInstancing = true;

        GameObject probe_root = new GameObject("GIProbe");

        for (int i = 0; i < shdata.Length; ++i)
        {
            //plane size is 10M X 10M
            GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere);
            //float[] pos_safe_array = ucExportLightProbe.FixedFloatArrayToSafeArray(shdata[i].pos, 3);
            sphere.transform.position = ucCoordToUnity.F3(new Vector3(shdata[i].pos[0] / 100.0f, shdata[i].pos[1] / 100.0f, shdata[i].pos[2] / 100.0f));
            //Debug.LogFormat("pos = ({0}, {1}, {2})", sphere.transform.position.x, sphere.transform.position.y, sphere.transform.position.z);
            float scale_factor = 0.1f;
            sphere.transform.localScale = new Vector3(scale_factor, scale_factor, scale_factor);
            //plane.transform.rotation = Quaternion.FromToRotation(Vector3.up, ucCoordToUnity.F3(normals[i].normalized));
            //plane.transform.LookAt(ucCoordToUnity.F3(normals[i]));
            //plane.transform.LookAt(new Vector3(1.0f, 0.0f, 0.0f));

            sphere.transform.parent = probe_root.transform;

            //props.SetColor("_Color", new Color(diff[i].x, diff[i].y, diff[i].z, 1.0f));
            const int   sh_num   = 4;
            shvectorrgb sh2_data = shdata[i].sh_vector;
            float[]     sh_r     = ucExportLightProbe.FixedFloatArrayToSafeArray(sh2_data.r.v, sh_num);
            //Debug.LogFormat("sh r = {0}, {1}, {2}, {3}", sh_r[0], sh_r[1], sh_r[2], sh_r[3]);
            props.SetVector("_sh2_r", new Vector4(sh_r[0], sh_r[1], sh_r[2], sh_r[3]));
            float[] sh_g = ucExportLightProbe.FixedFloatArrayToSafeArray(sh2_data.g.v, sh_num);
            props.SetVector("_sh2_g", new Vector4(sh_g[0], sh_g[1], sh_g[2], sh_g[3]));
            float[] sh_b = ucExportLightProbe.FixedFloatArrayToSafeArray(sh2_data.b.v, sh_num);
            props.SetVector("_sh2_b", new Vector4(sh_b[0], sh_b[1], sh_b[2], sh_b[3]));

            //Vector3 test_color = new Vector3(sh_r[1], sh_r[2], sh_r[3]);
            //test_color = test_color.normalized;
            //Vector4 test_color4 = new Vector4(Mathf.Abs(test_color.x), Mathf.Abs(test_color.y), Mathf.Abs(test_color.z), 1.0f);
            //float r = Random.Range(0.0f, 1.0f);
            //float g = Random.Range(0.0f, 1.0f);
            //float b = Random.Range(0.0f, 1.0f);
            //props.SetVector("_color", new Vector4(r, g, b, 1.0f));

            renderer = sphere.GetComponent <MeshRenderer>();
            renderer.shadowCastingMode = ShadowCastingMode.Off;
            renderer.receiveShadows    = false;
            renderer.material          = inst_mat;
            renderer.SetPropertyBlock(props);
        }
    }