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); }
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); }
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; }