public static List <Light> GetActivityLights(Renderer renderer, SimpleScene scene)
    {
        List <Light> rlt = new List <Light>();

        foreach (Light light in scene.lights)
        {
            if (light.isActiveAndEnabled)
            {
                if (light.type != LightType.Directional)
                {
                    Bounds bounds = renderer.bounds;
                    bounds.Expand(light.range);
                    Vector3 lightPos = light.transform.position;
                    if (bounds.Contains(lightPos))
                    {
                        rlt.Add(light);
                    }
                }
                else
                {
                    rlt.Add(light);
                }
            }
        }
        return(rlt);
    }
Esempio n. 2
0
        public SimpleClient(TcpClient tcpClient, SimpleScene scene)
        {
            this.tcpClient     = tcpClient;
            this.networkStream = tcpClient.GetStream();
            this.scene         = scene;

            logger.Info("Connected from {0}", tcpClient.Client.RemoteEndPoint);

            ThreadPool.QueueUserWorkItem(ReadThread);
        }
Esempio n. 3
0
        private void renderPass(bool notifyBeforeRender, SimpleScene.Util3d.SSFrustumCuller fc = null)
        {
            // reset stats
            renderConfig.renderStats = new SSRenderStats();

            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadMatrix(ref renderConfig.projectionMatrix);

            bool needObjectDelete = false;

            foreach (var obj in objects) {
                if (obj.renderState.toBeDeleted) { needObjectDelete = true; continue; }
                if (!obj.renderState.visible) continue; // skip invisible objects
                if (renderConfig.drawingShadowMap && !obj.renderState.castsShadow) continue; // skip non-shadow casters

                // frustum test...
                #if true
                if (renderConfig.frustumCulling
                 && obj.localBoundingSphereRadius >= 0f
                 && obj.renderState.frustumCulling
                 && fc != null
                 && !fc.isSphereInsideFrustum(obj.worldBoundingSphere)) {
                    renderConfig.renderStats.objectsCulled++;
                    continue; // skip the object
                }
                #endif

                // finally, render object
                if (notifyBeforeRender && BeforeRenderObject != null) {
                    BeforeRenderObject(obj, renderConfig);
                }
                renderConfig.renderStats.objectsDrawn++;
                obj.Render(renderConfig);
            }

            if (needObjectDelete) {
                objects.RemoveAll(o => o.renderState.toBeDeleted);
            }
        }
 public void Release()
 {
     RayTrace.Release();
     SimpleMaterial.textures.Clear();
     scene = null;
 }
    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;
    }