Skip to content

Commit

Permalink
WIP - Generar normales de las paredes en el Room Editor (#8)
Browse files Browse the repository at this point in the history
Generar normales de las paredes en el Room Editor fixes #6
  • Loading branch information
Javier-Rotelli authored Aug 10, 2017
1 parent 7dfa9a9 commit a047b42
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 28 deletions.
7 changes: 1 addition & 6 deletions TGC.Tools/RoomsEditor/RoomsEditorControl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,12 +263,7 @@ private void exportScene(string saveDir, string sceneName)
{
foreach (var wall in room.Walls)
{
var wallSegId = 0;
foreach (var wall3d in wall.WallSegments)
{
scene.Meshes.Add(wall3d.toMesh(room.Name + "-" + wall.Name + "-" + wallSegId));
wallSegId++;
}
scene.Meshes.AddRange(wall.ToMeshes());
}
}

Expand Down
12 changes: 6 additions & 6 deletions TGC.Tools/RoomsEditor/RoomsEditorRoom.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ public RoomsEditorRoom(string name, RoomsEditorMapView.RoomPanel roomPanel)

//crear paredes
Walls = new RoomsEditorWall[6];
Walls[0] = new RoomsEditorWall(this, "Roof");
Walls[1] = new RoomsEditorWall(this, "Floor");
Walls[2] = new RoomsEditorWall(this, "East");
Walls[3] = new RoomsEditorWall(this, "West");
Walls[4] = new RoomsEditorWall(this, "North");
Walls[5] = new RoomsEditorWall(this, "South");
Walls[0] = new RoomsEditorWall(this, "Roof", RoomsEditorWall.Types.Roof);
Walls[1] = new RoomsEditorWall(this, "Floor", RoomsEditorWall.Types.Floor);
Walls[2] = new RoomsEditorWall(this, "East", RoomsEditorWall.Types.East);
Walls[3] = new RoomsEditorWall(this, "West", RoomsEditorWall.Types.West);
Walls[4] = new RoomsEditorWall(this, "North", RoomsEditorWall.Types.North);
Walls[5] = new RoomsEditorWall(this, "South", RoomsEditorWall.Types.South);

//Valores default
Height = 100;
Expand Down
53 changes: 52 additions & 1 deletion TGC.Tools/RoomsEditor/RoomsEditorWall.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Microsoft.DirectX;
using TGC.Tools.Model;
using TGC.Tools.Utils.TgcGeometry;
using TGC.Tools.Utils.TgcSceneLoader;
Expand All @@ -11,10 +14,25 @@ namespace TGC.Tools.RoomsEditor
public class RoomsEditorWall
{
private RoomsEditorRoom room;
private Types type;

/// <summary>
/// Que tipo de pared es en un room
/// </summary>
public enum Types
{
Roof,
Floor,
East,
West,
North,
South
}

public RoomsEditorWall(RoomsEditorRoom room, string name)
public RoomsEditorWall(RoomsEditorRoom room, string name, Types type)
{
this.room = room;
this.type = type;
Name = name;
WallSegments = new List<TgcPlaneWall>();
IntersectingRooms = new List<RoomsEditorRoom>();
Expand All @@ -25,8 +43,32 @@ public RoomsEditorWall(RoomsEditorRoom room, string name)
AutoAdjustUv = true;
UTile = 1f;
VTile = 1f;

switch (type)
{
case Types.Roof:
Normal = new Vector3(0, -1, 0);
break;
case Types.Floor:
Normal = new Vector3(0, 1, 0);
break;
case Types.East:
Normal = new Vector3(-1, 0, 0);
break;
case Types.West:
Normal = new Vector3(1, 0, 0);
break;
case Types.North:
Normal = new Vector3(0, 0, -1);
break;
case Types.South:
Normal = new Vector3(0, 0, 1);
break;
}
}

public Vector3 Normal { get; private set; }

/// <summary>
/// Segmentos 3d de pared
/// </summary>
Expand Down Expand Up @@ -78,5 +120,14 @@ public void render()
wall3d.render();
}
}

public IEnumerable<TgcMesh> ToMeshes()
{
return this.WallSegments.Select((wall, ind) =>
{
wall.Normal = this.Normal;
return wall.toMesh(room.Name + "-" + this.Name + "-" + ind.ToString());
});
}
}
}
36 changes: 21 additions & 15 deletions TGC.Tools/Utils/TgcGeometry/TgcPlaneWall.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,11 +59,11 @@ public TgcPlaneWall()
}

/// <summary>
/// Crea una pared con un punto de origen, el tamaño de la pared y la orientación de la misma, especificando
/// Crea una pared con un punto de origen, el tamaño de la pared y la orientación de la misma, especificando
/// el tiling de la textura
/// </summary>
/// <param name="origin">Punto de origen de la pared</param>
/// <param name="size">Dimensiones de la pared. Uno de los valores será ignorado, según la orientación elegida</param>
/// <param name="size">Dimensiones de la pared. Uno de los valores será ignorado, según la orientación elegida</param>
/// <param name="orientation">Orientacion de la pared</param>
/// <param name="texture">Textura de la pared</param>
/// <param name="uTile">Cantidad de tile de la textura en coordenada U</param>
Expand All @@ -85,11 +85,11 @@ public TgcPlaneWall(Vector3 origin, Vector3 size, Orientations orientation, TgcT
}

/// <summary>
/// Crea una pared con un punto de origen, el tamaño de la pared y la orientación de la misma, con ajuste automatico
/// Crea una pared con un punto de origen, el tamaño de la pared y la orientación de la misma, con ajuste automatico
/// de coordenadas de textura
/// </summary>
/// <param name="origin">Punto de origen de la pared</param>
/// <param name="size">Dimensiones de la pared. Uno de los valores será ignorado, según la orientación elegida</param>
/// <param name="size">Dimensiones de la pared. Uno de los valores será ignorado, según la orientación elegida</param>
/// <param name="orientation">Orientacion de la pared</param>
/// <param name="texture">Textura de la pared</param>
public TgcPlaneWall(Vector3 origin, Vector3 size, Orientations orientation, TgcTexture texture)
Expand Down Expand Up @@ -120,7 +120,7 @@ public TgcPlaneWall(Vector3 origin, Vector3 size, Orientations orientation, TgcT
public Vector3 Size { get; set; }

/// <summary>
/// Orientación de la pared.
/// Orientación de la pared.
/// Llamar a updateValues() para aplicar cambios.
/// </summary>
public Orientations Orientation { get; set; }
Expand Down Expand Up @@ -162,7 +162,7 @@ public string Technique
public float VTile { get; set; }

/// <summary>
/// Auto ajustar coordenadas UV en base a la relación de tamaño de la pared y la textura
/// Auto ajustar coordenadas UV en base a la relación de tamaño de la pared y la textura
/// Llamar a updateValues() para aplicar cambios.
/// </summary>
public bool AutoAdjustUv { get; set; }
Expand All @@ -189,11 +189,16 @@ public Vector3 Position

/// <summary>
/// Habilita el renderizado con AlphaBlending para los modelos
/// con textura o colores por vértice de canal Alpha.
/// Por default está deshabilitado.
/// con textura o colores por vértice de canal Alpha.
/// Por default está deshabilitado.
/// </summary>
public bool AlphaBlendEnable { get; set; }

/// <summary>
/// La normal del plano. si no se setea se autocalcula
/// </summary>
public Vector3? Normal { get; set; } = null;

/// <summary>
/// Renderizar la pared
/// </summary>
Expand Down Expand Up @@ -233,7 +238,7 @@ public void dispose()

/// <summary>
/// Configurar punto minimo y maximo de la pared.
/// Se ignora un valor de cada punto según la orientación elegida.
/// Se ignora un valor de cada punto según la orientación elegida.
/// Llamar a updateValues() para aplicar cambios.
/// </summary>
/// <param name="min">Min</param>
Expand All @@ -245,7 +250,7 @@ public void setExtremes(Vector3 min, Vector3 max)
}

/// <summary>
/// Actualizar parámetros de la pared en base a los valores configurados
/// Actualizar parámetros de la pared en base a los valores configurados
/// </summary>
public void updateValues()
{
Expand Down Expand Up @@ -304,7 +309,7 @@ public void updateValues()
vertices[4] = new CustomVertex.PositionTextured(tRight, offsetU, offsetV);
vertices[5] = new CustomVertex.PositionTextured(bRight, offsetU + UTile, offsetV);

/*Versión con triángulos para el otro sentido
/*Versión con triángulos para el otro sentido
//Primer triangulo
vertices[0] = new CustomVertex.PositionTextured(tLeft, 0 * this.uTile, 1 * this.vTile);
vertices[1] = new CustomVertex.PositionTextured(bLeft, 1 * this.uTile, 1 * this.vTile);
Expand Down Expand Up @@ -371,7 +376,6 @@ public TgcMesh toMesh(string meshName)
using (var vb = d3dMesh.VertexBuffer)
{
var data = vb.Lock(0, 0, LockFlags.None);
var ceroNormal = new Vector3(0, 0, 0);
var whiteColor = Color.White.ToArgb();
for (var j = 0; j < vertices.Length; j++)
{
Expand All @@ -382,7 +386,7 @@ public TgcMesh toMesh(string meshName)
v.Position = vWall.Position;

//normals
v.Normal = ceroNormal;
v.Normal = (Normal ?? Vector3.Empty);

//texture coordinates diffuseMap
v.Tu = vWall.Tu;
Expand All @@ -408,8 +412,10 @@ public TgcMesh toMesh(string meshName)
}

//Calcular normales
d3dMesh.ComputeNormals();

if(Normal == null)
{
d3dMesh.ComputeNormals();
}
//Malla de TGC
var tgcMesh = new TgcMesh(d3dMesh, meshName, TgcMesh.MeshRenderType.DIFFUSE_MAP);
tgcMesh.DiffuseMaps = new[] { Texture.clone() };
Expand Down

0 comments on commit a047b42

Please sign in to comment.