public void configurarLuces(MeshLightData mld) { Effect effect = mld.mesh.Effect; ColorValue[] lightColors = new ColorValue[3]; Vector4[] pointLightPositions = new Vector4[3]; float[] pointLightIntensity = new float[3]; float[] pointLightAttenuation = new float[3]; float[] spotLightAngleCos = new float[3]; float[] spotLightExponent = new float[3]; Vector4[] spotLightDir = new Vector4[3]; for (int i = 0; i < 3; i++) { lightColors[i] = ColorValue.FromColor(mld.lights[i].color); pointLightPositions[i] = TgcParserUtils.vector3ToVector4(mld.lights[i].pos); spotLightDir[i] = TgcParserUtils.vector3ToVector4(mld.lights[i].direccion); pointLightIntensity[i] = mld.lights[i].intencidad; pointLightAttenuation[i] = mld.lights[i].atenuacion; spotLightExponent[i] = mld.lights[i].exp; spotLightAngleCos[i] = FastMath.ToRad(mld.lights[i].angleCos); } effect.SetValue("spotLightAngleCos", spotLightAngleCos); effect.SetValue("spotLightExponent", spotLightExponent); effect.SetValue("lightIntensity", pointLightIntensity); effect.SetValue("lightAttenuation", pointLightAttenuation); effect.SetValue("lightColor", lightColors); effect.SetValue("spotLightDir", spotLightDir); effect.SetValue("lightPosition", pointLightPositions); }
public void cargarEscena(String zona1, String zona2, String zona3, String dirEscena, String nombreEscena) { this.zona1 = zona1; this.zona2 = zona2; this.zona3 = zona3; //Cargar escenario, pero inicialmente solo hacemos el parser, para separar los objetos que son solo luces y no meshes string scenePath = GuiController.Instance.AlumnoEjemplosDir + dirEscena + nombreEscena; string mediaPath = GuiController.Instance.AlumnoEjemplosDir + dirEscena; TgcSceneParser parser = new TgcSceneParser(); TgcSceneData sceneData = parser.parseSceneFromString(File.ReadAllText(scenePath)); //Separar modelos reales de las luces, y las luces según el layeral que pertenecen List<TgcMeshData> realMeshData = new List<TgcMeshData>(); for (int i = 0; i < sceneData.meshesData.Length; i++) { TgcMeshData meshData = sceneData.meshesData[i]; //Es una luz, no cargar mesh, solo importan sus datos if (meshData.layerName.Equals(zona1+constLuz)) { //Guardar datos de luz de zona 1 LightData light = new LightData(meshData); lucesZona1.Add(light); }else if(meshData.layerName.Equals(zona2+constLuz)){ //Guardar datos de luz de zona 2 LightData light = new LightData(meshData); lucesZona2.Add(light); }else if(meshData.layerName.Equals(zona3+constLuz)){ //Guardar datos de luz de zona 3 LightData light = new LightData(meshData); lucesZona3.Add(light); } //Es un mesh real, agregar a array definitivo realMeshData.Add(meshData); } //Quedaron separados los meshes de las luces. Las luces están separadas por zona. //Reemplazar array original de meshData de sceneData por el definitivo sceneData.meshesData = realMeshData.ToArray(); //Ahora si cargar meshes reales TgcSceneLoader loader = new TgcSceneLoader(); scene = loader.loadScene(sceneData, mediaPath); GuiController.Instance.Logger.log("Empieza compilacion de shader", Color.Red); shader = TgcShaders.loadEffect(shaderUrl); GuiController.Instance.Logger.log("Fin compilacion de shader", Color.Red); shader.SetValue("mirrorBallTexture", TextureLoader.FromFile(GuiController.Instance.D3dDevice, GuiController.Instance.AlumnoEjemplosMediaDir + "\\mirrorBallLights.png")); //Pre-calculamos las 3 luces mas cercanas de cada mesh y cargamos el Shader foreach (TgcMesh mesh in scene.Meshes) { MeshLightData meshData = new MeshLightData(); meshData.mesh = mesh; Vector3 meshCenter = mesh.BoundingBox.calculateBoxCenter(); meshData.lights = lucesMasCercanas(meshCenter, 3, mesh.Layer); meshData.mesh.Effect = shader; //separados por zona, no se porqué, capaz para optimizar, no se if (mesh.Layer.Equals(this.zona1)) { meshesZona1.Add(meshData); } else if (mesh.Layer.Equals(this.zona2)) { meshesZona2.Add(meshData); } else if (mesh.Name.Equals("bola")) { createMirrorBall(mesh); }else { meshesZona3.Add(meshData); } if(mesh.Layer.Contains(constLuz)){ luzEnMovimiento(mesh, lucesMasCercanas(meshCenter, 1, mesh.Layer)); meshData.mesh.Position = meshCenter; } } }
private void createMirrorBall(TgcMesh bola) { //para que sea menos costoso de encontrar lo ponemos en un layer especial bola.Layer = "hall"; this.mirrorBall = new MeshLightData(); this.mirrorBall.mesh = bola; }
public String elegirTecnica(MeshLightData mesh) { int cantSpot = 0; String resultado; foreach (LightData ld in mesh.lights) { if (ld.spot) { cantSpot++; } } switch (cantSpot) { case 0: if (mesh.mesh.Layer.Contains(zona1) || mesh.mesh.Layer.Contains(zona3)) { resultado = "TRES_DIFFUSE_Y_BOLA"; } else { resultado = "TRES_DIFFUSE"; } break; case 1: if (mesh.mesh.Layer.Contains(zona1) || mesh.mesh.Layer.Contains(zona3)) { resultado = "SPOT_DOS_DIFFUSE_Y_BOLA"; } else { resultado = "UN_SPOT_DOS_DIFFUSE"; } break; case 2: if (mesh.mesh.Layer.Contains(zona1) || mesh.mesh.Layer.Contains(zona3)) { resultado = "DOS_SPOT_DIFFUSE_Y_BOLA"; } else { resultado = "DOS_SPOT_UN_DIFFUSE"; } break; default: if (mesh.mesh.Layer.Contains(zona1) || mesh.mesh.Layer.Contains(zona3)) { resultado = "TRES_SPOT_Y_BOLA"; } else { resultado = "TRES_SPOT"; } break; } return resultado; }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //Cargar escenario TgcSceneLoader loader = new TgcSceneLoader(); //Cargar textura de CubeMap para Environment Map, fijo para todos los meshes cubeMap = TextureLoader.FromCubeFile(d3dDevice, GuiController.Instance.ExamplesMediaDir + "Shaders\\CubeMap.dds"); //Cargar Shader personalizado de EnvironmentMap effect = TgcShaders.loadEffect(GuiController.Instance.AlumnoEjemplosDir + "AlumnoMedia\\RideTheLightning\\Shaders\\EnvironmentMap_Integrador2.fx"); //Configurar MeshFactory customizado //scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\DepositoMin\\Deposito-TgcScene.xml"); // scene = loader.loadSceneFromFile(GuiController.Instance.ExamplesMediaDir + "MeshCreator\\Scenes\\Deposito2\\Deposito-TgcScene.xml"); //Cargar escenario, pero inicialmente solo hacemos el parser, para separar los objetos que son solo luces y no meshes string scenePath = GuiController.Instance.AlumnoEjemplosDir + "AlumnoMedia\\RideTheLightning\\Scenes\\Deposito\\Deposito-TgcScene.xml"; string mediaPath = GuiController.Instance.AlumnoEjemplosDir + "AlumnoMedia\\RideTheLightning\\Scenes\\Deposito\\"; TgcSceneParser parser = new TgcSceneParser(); TgcSceneData sceneData = parser.parseSceneFromString(File.ReadAllText(scenePath)); //Separar modelos reales de las luces, segun layer "Lights" lights = new List<LightData>(); List<TgcMeshData> realMeshData = new List<TgcMeshData>(); for (int i = 0; i < sceneData.meshesData.Length; i++) { TgcMeshData meshData = sceneData.meshesData[i]; //Es una luz, no cargar mesh, solo importan sus datos if (meshData.layerName == "lights") { //Guardar datos de luz LightData light = new LightData(); light.color = Color.FromArgb((int)meshData.color[0], (int)meshData.color[1], (int)meshData.color[2]); light.aabb = new TgcBoundingBox(TgcParserUtils.float3ArrayToVector3(meshData.pMin), TgcParserUtils.float3ArrayToVector3(meshData.pMax)); light.pos = light.aabb.calculateBoxCenter(); light.spot = meshData.userProperties["esSpot"].Equals("SI"); light.direccion = convertirDireccion(meshData.userProperties["dir"]); lights.Add(light); } //Es un mesh real, agregar a array definitivo else { realMeshData.Add(meshData); } } //Reemplazar array original de meshData de sceneData por el definitivo sceneData.meshesData = realMeshData.ToArray(); //Ahora si cargar meshes reales scene = loader.loadScene(sceneData, mediaPath); //Pre-calculamos las 3 luces mas cercanas de cada mesh meshesYLuces = new List<MeshLightData>(); foreach (TgcMesh mesh in scene.Meshes) { MeshLightData meshData = new MeshLightData(); meshData.mesh = mesh; Vector3 meshCeter = mesh.BoundingBox.calculateBoxCenter(); meshData.lights = lucesMasCercanas(meshCeter, 3); meshesYLuces.Add(meshData); } //Camara en 1ra persona GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.MovementSpeed = 400f; GuiController.Instance.FpsCamera.JumpSpeed = 300f; GuiController.Instance.FpsCamera.setCamera(new Vector3(80, 80, 0), new Vector3(0, 80, 1)); //Mesh para la luz //Modifiers de la luz GuiController.Instance.Modifiers.addBoolean("lightEnable", "lightEnable", true); GuiController.Instance.Modifiers.addBoolean("linterna", "linterna", true); GuiController.Instance.Modifiers.addBoolean("foco", "foco", true); GuiController.Instance.Modifiers.addColor("lightColor", Color.White); GuiController.Instance.Modifiers.addFloat("lightIntensity", 0, 150, 35); GuiController.Instance.Modifiers.addFloat("lightAttenuation", 0.1f, 2, 0.3f); GuiController.Instance.Modifiers.addFloat("specularEx", 0, 20, 9f); GuiController.Instance.Modifiers.addFloat("spotAngle", 0, 180, 39f); GuiController.Instance.Modifiers.addFloat("spotExponent", 0, 20, 7f); //Modifiers de material GuiController.Instance.Modifiers.addColor("mEmissive", Color.Black); GuiController.Instance.Modifiers.addColor("mAmbient", Color.White); GuiController.Instance.Modifiers.addColor("mDiffuse", Color.White); GuiController.Instance.Modifiers.addColor("mSpecular", Color.White); }