コード例 #1
0
    public static void RebuildMeshObjectBuffers()
    {
        if (!NeedRebuilding)
        {
            return;
        }
        RayTracingMaster.Rerender();


        _meshObjects.Clear();
        _vertices.Clear();
        _normals.Clear();
        _indices.Clear();
        foreach (var obj in _rayTracingObjects)
        {
            int firstVertex       = _vertices.Count;
            UnityEngine.Mesh mesh = obj.GetComponent <MeshFilter>().mesh;
            _vertices.AddRange(mesh.vertices);
            _normals.AddRange(mesh.normals);
            //注意当前模型的第一个顶点并不是所有模型中的第一个顶点
            int firstIndex = _indices.Count;
            var indices    = mesh.GetIndices(0);
            _indices.AddRange(indices.Select(index => index + firstVertex));
            _meshObjects.Add(new Mesh()
            {
                localToWorldMatrix       = obj.transform.localToWorldMatrix,
                localNormalToWorldMatrix = obj.transform.localToWorldMatrix.inverse.transpose,
                indices_offset           = firstIndex,
                indices_count            = indices.Length
            });
        }
        NeedRebuilding = false;
    }
コード例 #2
0
 public override void Configure(CommandBuffer cmd, RenderTextureDescriptor cameraTextureDescriptor)
 {
     if (rayTracingMaster == null)
     {
         rayTracingMaster = FindObjectOfType <RayTracingMaster>();
     }
 }
コード例 #3
0
 private void Update()
 {
     if (beforeTransform != this.transform)
     {
         RayTracingMaster.UnregisterObject(this);
         RayTracingMaster.RegisterObject(this);
     }
 }
コード例 #4
0
 private void OnEnable()
 {
     if (RandomMaterial)
     {
         this.SetRandom();
     }
     RayTracingMaster.RegisterObject(this);
 }
コード例 #5
0
    void Awake()
    {
        if (string.IsNullOrWhiteSpace(objectName))
        {
            objectName = gameObject.name;
        }

        RayTracingMaster.RegisterObject(this);
    }
コード例 #6
0
 void Update()
 {
     if (transform.hasChanged)
     {
         RayTracingMaster.UpdateObject(transform);
         //print("The transform has changed!");
         transform.hasChanged = false;
     }
 }
コード例 #7
0
    public void SetSceneData()
    {
        _SceneData = new SceneData();

        _SceneData._MaxRecursionDepth = maxRecursionDepth;

        SetBackgroundColor();
        ParseSceneCameras();
        SetRenderCameraData();
        ParseSceneLights();
        ParseSceneObjects();

        Transform[] cameraTransforms = GameObject.Find("SceneCameras").GetComponentsInChildren <Transform>();
        if (cameraNo <= _SceneData._CameraDatas.Count)
        {
            rayTracingMaster = cameraTransforms[cameraNo].GetComponent <RayTracingMaster>();
        }
    }
コード例 #8
0
    private void OnEnable()
    {
        //MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        //CombineInstance[] combine = new CombineInstance[10];

        //int i = 0;
        //while (i < 10)
        //{
        //    combine[i].mesh = meshFilters[i].sharedMesh;
        //    combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
        //    meshFilters[i].gameObject.SetActive(false);

        //    i++;
        //}
        //transform.GetComponent<MeshFilter>().mesh = new Mesh();
        //transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
        //transform.gameObject.SetActive(true);
        RayTracingMaster.RegisterObject(this);
    }
コード例 #9
0
    public static void SetRandomSpheres(uint SpheresMax, Vector3 SphereRadius, float SpherePlacementRadius)
    {
        RayTracingMaster.Rerender();
        for (int i = 0; i < SpheresMax; i++)
        {
            Sphere sphere = new Sphere();
            sphere.radius = SphereRadius.x + Random.value * (SphereRadius.y - SphereRadius.x);
            //由单位圆内随机映射为所给半径圆内随机
            Vector2 randomPos = Random.insideUnitCircle * SpherePlacementRadius;
            //与y=0平面相切
            sphere.position = new Vector3(randomPos.x, sphere.radius, randomPos.y);
            //判断是否与已生成球重合
            bool isInOther = false;
            foreach (Sphere other in spheres)
            {
                float minDist = sphere.radius + other.radius;
                if (Vector3.SqrMagnitude(sphere.position - other.position) < minDist * minDist)
                {
                    isInOther = true;
                }
            }
            if (isInOther)
            {
                continue;
            }
            //一半几率生成漫反射,一半几率生成镜面反射
            Color color = Random.ColorHSV();
            bool  metal = Random.value < 0.5f;
            sphere.albedo   = metal ? Vector3.zero : new Vector3(color.r, color.g, color.b);
            sphere.specular = metal ? new Vector3(color.r, color.g, color.b) : Vector3.one * 0.04f;
            Color emissioncolor = Random.ColorHSV();

            sphere.emission = (Random.value > 0.85) ?
                              new Vector3(emissioncolor.r, emissioncolor.g, emissioncolor.b) * Random.Range(3, 40)
                : Vector3.zero;
            sphere.smoothness = Random.Range(0.7f, 1.0f);
            sphere.smoothness = SmoothnessToPhongAlpha(sphere.smoothness);
            spheres.Add(sphere);
        }
    }
コード例 #10
0
 // Awake() and Start() are called only once per object
 // But OnEnable() can be called everytime  the object is enabled either by another
 // script or Unity; So use Awake() for the absolute initialization purpose
 void OnEnable()
 {
     RayTracingMaster.RegisterParaboloidMirror(this);
 }
コード例 #11
0
 private void OnDisable()
 {
     RayTracingMaster.UnregisterGeoConeMirror(this);
 }
コード例 #12
0
 private void OnEnable()
 {
     RayTracingMaster.RegisterGeoConeMirror(this);
 }
コード例 #13
0
 private void OnDisable() => RayTracingMaster.UnregisterObject(this);
コード例 #14
0
 private void OnDisable()
 {
     RayTracingMaster.UnregisterPyramidMirror(this);
 }
コード例 #15
0
 void OnDisable()
 {
     RayTracingMaster.UnregisterParaboloidMirror(this);
 }
コード例 #16
0
 private void OnEnable()
 {
     m_rtmScript = (RayTracingMaster)target;
 }
コード例 #17
0
 private void OnEnable()
 {
     RayTracingMaster.RegisterObject(this);
     rayTracingMaster.transformsToWatch.Add(transform);
 }
コード例 #18
0
 private void OnDisable()
 {
     RayTracingMaster.UnregisterObj(this);
 }
コード例 #19
0
 void OnDisable()
 {
     RayTracingMaster.UnregisterTriangularConeMirror(this);
 }
コード例 #20
0
 void OnEnable()
 {
     RayTracingMaster.RegisterTriangularConeMirror(this);
 }
コード例 #21
0
 private void OnEnable()
 {
     RayTracingMaster.RegisterPyramidMirror(this);
 }
コード例 #22
0
 private void OnEnable()
 {
     RayTracingMaster.RegisterObject(this);
     beforeTransform = this.transform;
 }
コード例 #23
0
 private void OnEnable()
 {
     RayTracingMaster.RegisterObject(this);
 }
コード例 #24
0
 void OnBecameInvisible()
 {
     RayTracingMaster.UnregisterSphereObject(this);
 }
コード例 #25
0
    //void OnEnable() {
    //   RayTracingMaster.RegisterObject(this);
    // }

    void OnDisable()
    {
        RayTracingMaster.UnregisterObject(this);
    }
コード例 #26
0
 void OnDisable()
 {
     RayTracingMaster.UnregisterHemisphereMirror(this);
 }
コード例 #27
0
 // Start is called before the first frame update
 void OnBecameVisible()
 {
     RayTracingMaster.RegisterSphereObject(this);
 }
コード例 #28
0
 void OnEnable()
 {
     RayTracingMaster.RegisterHemisphereMirror(this);
 }