private void UpdateRaytrace()
    {
        // make sure the canvas is correct
        int newWidth = (int)(Screen.width / _downsampling);

        if (_canvasTex == null || _canvasTex.width != newWidth)
        {
            _canvasTex            = new Texture2D(newWidth, (int)(Screen.height / _downsampling));
            _canvasTex.filterMode = FilterMode.Point;
        }

        // get main camera
        Camera cam = Camera.main;

        // get width and height
        int width  = _canvasTex.width,
            height = _canvasTex.height;

        // get z pos
        float camZ  = cam.transform.position.z;
        Color black = Color.black;

        // calculate color for each pixel on the canvas
        for (float i = 0; i < width; ++i)
        {
            for (float j = 0; j < height; ++j)
            {
                // Get Ray from pixel and zpos
                Vector3 pos = new Vector3(i / width, j / height, camZ);
                Ray     ray = cam.ViewportPointToRay(pos);


                RaycastHit raycastHitInfo;
                bool       didHit = Physics.Raycast(ray, out raycastHitInfo);
                if (didHit)
                {
                    // get the color from the RayTraceRenderer
                    RayTraceRenderer comp = raycastHitInfo.collider.GetComponent <RayTraceRenderer>();
                    if (comp != null)
                    {
                        _canvasTex.SetPixel((int)i, (int)j, comp.CalculateColor(raycastHitInfo, _recursionDepth, _ambience, ray));
                    }
                    else
                    {
                        _canvasTex.SetPixel((int)i, (int)j, black);
                    }
                }
                else
                {
                    // otherwise just set the color to black
                    _canvasTex.SetPixel((int)i, (int)j, black);
                }
            }
        }

        _canvasTex.Apply();
    }
Ejemplo n.º 2
0
    private Color Bounce(Ray ray, int depth)
    {
        RaycastHit raycastHitInfo;

        if (Physics.Raycast(ray, out raycastHitInfo))
        {
            RayTraceRenderer comp = raycastHitInfo.collider.GetComponent <RayTraceRenderer>();
            if (comp != null)
            {
                return(comp.CalculateColor(ray, raycastHitInfo, depth - 1));
            }
        }

        return(Color.clear);
    }
    protected Color Bounce(Ray inRay, int depth, float ambience)
    {
        if (depth > 0)
        {
            RaycastHit outHit;
            bool       hit = Physics.Raycast(inRay, out outHit);
            if (hit)
            {
                RayTraceRenderer renderer = outHit.transform.gameObject.GetComponent <RayTraceRenderer>();
                if (renderer)
                {
                    return(renderer.CalculateColor(outHit, --depth, ambience, inRay));
                }
            }
        }


        return(Color.clear);
    }
Ejemplo n.º 4
0
    public void Init()
    {
        Instance = this;
        updateProgress(0);
        HaltonTool.InitHaltonSequence();

        Debug.Log("Start Time : " + Time.realtimeSinceStartup);

        scene = new SimpleScene();

        RayTrace.Init();
        SimpleMaterial.textures.Clear();

        scene.lights = GameObject.FindObjectsOfType <Light>();

        Camera cam = GetComponent <Camera>();

        if (cam)
        {
            MeshRenderer[] renderers = GameObject.FindObjectsOfType <MeshRenderer>();
            foreach (MeshRenderer r in renderers)
            {
                bool isLayerVisible = ((1 << r.gameObject.layer) & cam.cullingMask) != 0;
                if (r.isVisible && isLayerVisible)
                {
                    MeshFilter filter = r.gameObject.GetComponent <MeshFilter>();
                    if (filter && filter.sharedMesh)
                    {
                        for (int i = 0; i < filter.sharedMesh.subMeshCount; i++)
                        {
                            Mesh  mesh      = filter.sharedMesh;
                            int[] triangles = filter.sharedMesh.GetTriangles(i);
                            RayTrace.AddMesh(filter.gameObject.transform, mesh.vertexCount, triangles.Length, mesh.vertices, triangles, 1);
                            SimpleModel model = new SimpleModel(r.gameObject.transform, filter.sharedMesh, i, r.sharedMaterials[i]);
                            model.lights = RayTraceTool.GetActivityLights(r, scene);
                            scene.models.Add(model);
                        }
                    }
                }
            }
            Terrain[] terrains = GameObject.FindObjectsOfType <Terrain>();
            foreach (Terrain terrain in terrains)
            {
                bool isLayerVisible = ((1 << terrain.gameObject.layer) & cam.cullingMask) != 0;
                if (terrain.gameObject.activeInHierarchy && isLayerVisible)
                {
                    int   w          = terrain.terrainData.heightmapWidth;
                    int   h          = terrain.terrainData.heightmapHeight;
                    float realWidth  = terrain.terrainData.size.x * (1 + 1f / w);
                    float realHeight = terrain.terrainData.size.z * (1 + 1f / h);
                    float[,] heights = terrain.terrainData.GetHeights(0, 0, w, h);
                    Vector3[] vertices  = new Vector3[w * h];
                    Vector2[] uvs       = new Vector2[vertices.Length];
                    Vector3[] normals   = new Vector3[vertices.Length];
                    int[]     triangles = new int[(w - 1) * (h - 1) * 2 * 3];
                    for (int i = 0; i < w; i++)
                    {
                        for (int j = 0; j < h; j++)
                        {
                            Vector3 pos = new Vector3(i * realWidth / w, heights[j, i] * terrain.terrainData.size.y, j * realHeight / h);
                            vertices[j * w + i] = pos;
                            uvs[j * w + i]      = new Vector2(i / (float)w, j / (float)h);
                            normals[j * w + i]  = terrain.terrainData.GetInterpolatedNormal(i / (float)w, j / (float)h);
                        }
                    }

                    for (int i = 0; i < w - 1; i++)
                    {
                        for (int j = 0; j < h - 1; j++)
                        {
                            int index = (j * (w - 1) + i) * 6;
                            triangles[index + 0] = (i + 0) + (j + 0) * w;
                            triangles[index + 1] = (i + 1) + (j + 1) * w;
                            triangles[index + 2] = (i + 1) + (j + 0) * w;
                            triangles[index + 3] = (i + 0) + (j + 0) * w;
                            triangles[index + 4] = (i + 0) + (j + 1) * w;
                            triangles[index + 5] = (i + 1) + (j + 1) * w;
                        }
                    }

                    RayTrace.AddMesh(terrain.transform, vertices.Length, triangles.Length, vertices, triangles, 1);
                    SimpleModel model = new SimpleModel();
                    model.mesh     = new SimpleMesh(triangles, uvs, vertices, normals);
                    model.material = new SimpleTerrainMaterial(terrain.terrainData);
                    model.rst      = new RayTrace.RST(terrain.transform.rotation, terrain.transform.lossyScale, terrain.transform.position);
                    model.lights.AddRange(scene.lights);
                    scene.models.Add(model);
                }
            }
        }

        RayTrace.Commit();

        texture = new Texture2D(width, height, TextureFormat.ARGB32, true);
        //viewResult.sharedMaterial.mainTexture = texture;
    }
Ejemplo n.º 5
0
    void OnEnable()
    {
        renderer = target as RayTraceRenderer;

        EditorUtility.ClearProgressBar();
    }