public override void Init() { //Cargar escenario, pero inicialmente solo hacemos el parser, para separar los objetos que son solo luces y no meshes var scenePath = MediaDir + "Escenario\\EscenarioLuces-TgcScene.xml"; var mediaPath = MediaDir + "Escenario\\"; var parser = new TgcSceneParser(); var sceneData = parser.parseSceneFromString(File.ReadAllText(scenePath)); //Separar modelos reales de las luces, segun layer "Lights" lights = new List <LightData>(); var realMeshData = new List <TgcMeshData>(); for (var i = 0; i < sceneData.meshesData.Length; i++) { var meshData = sceneData.meshesData[i]; //Es una luz, no cargar mesh, solo importan sus datos if (meshData.layerName == "Lights") { //Guardar datos de luz var light = new LightData(); light.color = Color.FromArgb((int)meshData.color[0], (int)meshData.color[1], (int)meshData.color[2]); light.aabb = new TgcBoundingAxisAlignBox(TgcParserUtils.float3ArrayToVector3(meshData.pMin), TgcParserUtils.float3ArrayToVector3(meshData.pMax)); light.pos = light.aabb.calculateBoxCenter(); 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 var loader = new TgcSceneLoader(); scene = loader.loadScene(sceneData, mediaPath); //Camara en 1ra persona Camara = new TgcFpsCamera(new Vector3(-20, 80, 450), 400f, 300f, Input); //Modifiers para variables de luz Modifiers.addBoolean("lightEnable", "lightEnable", true); Modifiers.addFloat("lightIntensity", 0, 150, 20); Modifiers.addFloat("lightAttenuation", 0.1f, 2, 0.3f); Modifiers.addFloat("specularEx", 0, 20, 9f); //Modifiers para material Modifiers.addColor("mEmissive", Color.Black); Modifiers.addColor("mAmbient", Color.White); Modifiers.addColor("mDiffuse", Color.White); Modifiers.addColor("mSpecular", Color.White); }
public SceneEditorControl(TgcSceneEditor editor) { InitializeComponent(); this.editor = editor; parser = new TgcSceneParser(); sceneLoader = new TgcSceneLoader(); pickingRay = new TgcPickingRay(); translateGizmo = new SceneEditorTranslateGizmo(); helpWindow = new SceneEditorHelpWindow(); //openMeshDialog openMeshDialog = new OpenFileDialog(); openMeshDialog.CheckFileExists = true; openMeshDialog.Title = "Seleccionar malla de formato TGC"; openMeshDialog.Filter = "-TgcScene.xml |*-TgcScene.xml"; openMeshDialog.Multiselect = false; //openMeshDialog.InitialDirectory = GuiController.Instance.ExamplesMediaDir + "ModelosTgc\\"; openMeshDialog.FileName = GuiController.Instance.ExamplesMediaDir + "ModelosTgc\\Box\\Box-TgcScene.xml"; fileName.Text = "Box-TgcScene.xml"; meshFilePath = openMeshDialog.FileName; //openHeighmapDialog openHeighmapDialog = new OpenFileDialog(); openHeighmapDialog.CheckFileExists = true; openHeighmapDialog.Title = "Seleccionar Heighmap"; openHeighmapDialog.Filter = ".JPG|*.jpg|.JPEG|*.jpeg|.GIF|*.gif|.PNG|*.png|.BMP|*.bmp | .TGA |*.tga"; openHeighmapDialog.Multiselect = false; openHeighmapDialog.InitialDirectory = GuiController.Instance.ExamplesMediaDir + "Heighmaps\\"; //openHeighmapDialog openTextureDialog = new OpenFileDialog(); openTextureDialog.CheckFileExists = true; openTextureDialog.Title = "Seleccionar textura de terreno"; openTextureDialog.Filter = ".JPG|*.jpg|.JPEG|*.jpeg|.GIF|*.gif|.PNG|*.png|.BMP|*.bmp | .TGA |*.tga"; openTextureDialog.Multiselect = false; openTextureDialog.InitialDirectory = GuiController.Instance.ExamplesMediaDir + "Heighmaps\\"; //saveSceneDialog saveSceneDialog = new SaveFileDialog(); saveSceneDialog.DefaultExt = ".xml"; saveSceneDialog.Filter = ".XML |*.xml"; saveSceneDialog.AddExtension = true; selectedMeshList = new List <SceneEditorMeshObject>(); //Estado inicial currentState = GuiState.Nothing; tabControl.SelectedTab = tabControl.TabPages["tabPageCreate"]; //Camara inicial GuiController.Instance.FpsCamera.setCamera(new Vector3(50.406f, 185.5353f, -143.7283f), new Vector3(-92.5515f, -567.6361f, 498.3744f)); }
public override void init() { Device d3dDevice = GuiController.Instance.D3dDevice; //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.ExamplesMediaDir + "Shaders\\EnvironmentMap_Integrador2.fx"); //Cargar escenario, pero inicialmente solo hacemos el parser, para separar los objetos que son solo luces y no meshes string scenePath = GuiController.Instance.ExamplesDir + "Lights\\NormalMapRoom\\NormalMapRoom-TgcScene.xml"; string mediaPath = GuiController.Instance.ExamplesDir + "Lights\\NormalMapRoom\\"; 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(); 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 TgcSceneLoader loader = new TgcSceneLoader(); TgcScene scene = loader.loadScene(sceneData, mediaPath); //Separar meshes con bumpMapping de los comunes List <TgcMeshBumpMapping> bumpMeshes = new List <TgcMeshBumpMapping>(); commonMeshes = new List <TgcMesh>(); foreach (TgcMesh mesh in scene.Meshes) { //Mesh con BumpMapping if (mesh.Layer == "BumpMap") { //Por convencion de este ejemplo el NormalMap se llama igual que el DiffuseMap (y cada mesh tiene una sola) string path = mesh.DiffuseMaps[0].FilePath; string[] split = path.Split('.'); path = split[0] + "_NormalMap.png"; //Convertir TgcMesh a TgcMeshBumpMapping TgcTexture normalMap = TgcTexture.createTexture(path); TgcTexture[] normalMapArray = new TgcTexture[] { normalMap }; TgcMeshBumpMapping bumpMesh = TgcMeshBumpMapping.fromTgcMesh(mesh, normalMapArray); bumpMesh.Effect = effect; bumpMesh.Technique = "ThreeLightsTechnique"; bumpMeshes.Add(bumpMesh); //Liberar original mesh.dispose(); } //Mesh normal else { commonMeshes.Add(mesh); } } //Pre-calculamos las 3 luces mas cercanas de cada mesh meshesWithLight = new List <MeshLightData>(); foreach (TgcMeshBumpMapping mesh in bumpMeshes) { MeshLightData meshData = new MeshLightData(); meshData.mesh = mesh; Vector3 meshCeter = mesh.BoundingBox.calculateBoxCenter(); meshData.lights[0] = getClosestLight(meshCeter, null, null); meshData.lights[1] = getClosestLight(meshCeter, meshData.lights[0], null); meshData.lights[2] = getClosestLight(meshCeter, meshData.lights[0], meshData.lights[1]); meshesWithLight.Add(meshData); } //Camara en 1ra persona GuiController.Instance.FpsCamera.Enable = true; GuiController.Instance.FpsCamera.setCamera(new Vector3(0, 50, 100), new Vector3(0, 50, -1)); //Modifiers GuiController.Instance.Modifiers.addBoolean("lightEnable", "lightEnable", true); GuiController.Instance.Modifiers.addFloat("reflection", 0, 1, 0.2f); GuiController.Instance.Modifiers.addFloat("bumpiness", 0, 2, 1f); GuiController.Instance.Modifiers.addFloat("lightIntensity", 0, 150, 20); GuiController.Instance.Modifiers.addFloat("lightAttenuation", 0.1f, 2, 0.3f); GuiController.Instance.Modifiers.addFloat("specularEx", 0, 20, 9f); 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); }
public override void Init() { //Cargar textura de CubeMap para Environment Map, fijo para todos los meshes cubeMap = TextureLoader.FromCubeFile(D3DDevice.Instance.Device, MediaDir + "CubeMap.dds"); //Cargar Shader personalizado de EnvironmentMap effect = TgcShaders.loadEffect(ShadersDir + "EnvironmentMap.fx"); //Cargar escenario, pero inicialmente solo hacemos el parser, para separar los objetos que son solo luces y no meshes var scenePath = MediaDir + "NormalMapRoom\\NormalMapRoom-TgcScene.xml"; var mediaPath = MediaDir + "NormalMapRoom\\"; var parser = new TgcSceneParser(); var sceneData = parser.parseSceneFromString(File.ReadAllText(scenePath)); //Separar modelos reales de las luces, segun layer "Lights" lights = new List <LightData>(); var realMeshData = new List <TgcMeshData>(); for (var i = 0; i < sceneData.meshesData.Length; i++) { var meshData = sceneData.meshesData[i]; //Es una luz, no cargar mesh, solo importan sus datos if (meshData.layerName == "Lights") { //Guardar datos de luz var light = new LightData(); light.color = Color.FromArgb((int)meshData.color[0], (int)meshData.color[1], (int)meshData.color[2]); light.aabb = new TgcBoundingAxisAlignBox(TgcParserUtils.float3ArrayToVector3(meshData.pMin), TgcParserUtils.float3ArrayToVector3(meshData.pMax)); light.pos = light.aabb.calculateBoxCenter(); 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 var loader = new TgcSceneLoader(); var scene = loader.loadScene(sceneData, mediaPath); //Separar meshes con bumpMapping de los comunes bumpMeshes = new List <TgcMeshBumpMapping>(); commonMeshes = new List <TgcMesh>(); foreach (var mesh in scene.Meshes) { //Mesh con BumpMapping if (mesh.Layer == "BumpMap") { //Por convencion de este ejemplo el NormalMap se llama igual que el DiffuseMap (y cada mesh tiene una sola) var path = mesh.DiffuseMaps[0].FilePath; var split = path.Split('.'); path = split[0] + "." + split[1] + "_NormalMap.png"; //Convertir TgcMesh a TgcMeshBumpMapping var normalMap = TgcTexture.createTexture(path); TgcTexture[] normalMapArray = { normalMap }; var bumpMesh = TgcMeshBumpMapping.fromTgcMesh(mesh, normalMapArray); bumpMesh.Effect = effect; bumpMesh.Technique = "EnvironmentMapTechnique"; bumpMeshes.Add(bumpMesh); //Liberar original mesh.dispose(); } //Mesh normal else { commonMeshes.Add(mesh); } } //Camara en 1ra persona Camara = new TgcFpsCamera(new Vector3(0, 50, 100), Input); //Modifiers Modifiers.addFloat("reflection", 0, 1, 0.2f); Modifiers.addFloat("bumpiness", 0, 2, 1f); Modifiers.addFloat("lightIntensity", 0, 150, 20); Modifiers.addFloat("lightAttenuation", 0.1f, 2, 0.3f); Modifiers.addFloat("specularEx", 0, 20, 9f); Modifiers.addColor("mEmissive", Color.Black); Modifiers.addColor("mAmbient", Color.White); Modifiers.addColor("mDiffuse", Color.White); Modifiers.addColor("mSpecular", Color.White); }