//public Dictionary<String, String> Materials; public Slidewindow(Data.Cord loc, Data.Rot rot, Data.Size size, double frame) { this.Location = loc; this.Rotation = rot; this.Size = size; this.Frame = frame; }
public Floor(Data.Cord location, double thickness, List <Data.Cord> verts, Dictionary <string, string> materials) { this.Location = location; this.Thickness = thickness; this.Vertices = verts; this.Materials = materials; }
public Pointlight(Data.Cord location, double intensity, int red, int green, int blue) { this.Location = location; this.Intensity = intensity; this.Red = red; this.Green = green; this.Blue = blue; }
public Fixedwindow(Data.Cord loc, Data.Rot rot, Data.Size size, double frame, Dictionary <String, String> materials) { this.Location = loc; this.Rotation = rot; this.Size = size; this.Frame = frame; this.Materials = materials; }
public Flatroof(Data.Cord loc, Data.Rot rot, double roofH, double sideR, double mainR, Dictionary <String, String> materials) { this.Location = loc; this.Rotation = rot; this.RoofHeight = roofH; this.SideRafter = sideR; this.MainRafter = mainR; this.Materials = materials; }
public Wall(Data.Cord startPoint, Data.Cord endPoint, double width, double height, List <Data.Hole> holes, Dictionary <String, String> materials) { this.Start = startPoint; this.End = endPoint; this.Width = width; this.Height = height; this.Holes = holes; this.Materials = materials; }
//배치를 바꿔다시 계산하는 의외로 중요한 함수 public void ChangeLocation(Data.Cord newLocation) { double x = newLocation.X - Location.X; double y = newLocation.Y - Location.Y; double z = newLocation.Z - Location.Z; this.Location = (Data.Cord)newLocation.Clone(); UpdateSides(x, y, z); }
public Fullstair(Data.Cord location, Data.Rot rotation, int stepNumber, double stepLength, double stepWidth, double stepHeight, double foundation, Dictionary <String, String> materials) { this.Location = location; this.Rotation = rotation; this.StepNumber = stepNumber; this.StepLength = stepLength; this.StepWidth = stepWidth; this.StepHeight = stepHeight; this.Foundation = foundation; this.Materials = materials; }
//TODO: Side를 체크해서 연결된 부분의 방향에 따라, 계단의 배치가 변경되도록 코딩할 필요가 있다. protected virtual void CreateFullstair(RelationLevel level) { //계단 생성을 위한 변수 Data.Cord location = new Data.Cord(); Data.Rot rotation = new Data.Rot(); int number = 7; double width = this.Size.Length / 2 - Data.Config.WallTickness; double length = (this.Size.Width - (width * 2)) / number; double height = (Data.Config.RoomHeight / 2) / 8; double foundation = 0; //처음 진입하는 계단 rotation = new Data.Rot(0, 0, 270); location = new Data.Cord( this.Location.X + Data.Config.WallTickness, this.Location.Y + this.Size.Width - width - 10, // -10은 Stair 모델에서 튀어나온 부분 때문에 겹치지 않도록 하느라... this.Location.Z + Data.Config.FloorTickness); this.Components.Add(new Model.Fullstair(location, rotation, number, length, width, height, foundation, Materials[Model.ModelType.Fullstair])); //2층 계단으로 진입하기 전, 평지 //오른쪽 foundation = (Data.Config.RoomHeight / 2) - height; location = new Data.Cord( this.Location.X + Data.Config.WallTickness, this.Location.Y + this.Size.Width - Data.Config.WallTickness, this.Location.Z + Data.Config.FloorTickness + foundation); this.Components.Add(new Model.Fullstair(location, rotation, 1, width, width, height, foundation, Materials[Model.ModelType.Fullstair])); //왼쪽 rotation = new Data.Rot(0, 0, 90); location = new Data.Cord(this.Location.X - Data.Config.WallTickness + this.Size.Length, this.Location.Y + this.Size.Width - Data.Config.WallTickness - width, this.Location.Z + Data.Config.FloorTickness + foundation); this.Components.Add(new Model.Fullstair(location, rotation, 1, width, width, height, foundation, Materials[Model.ModelType.Fullstair])); //2층 진입 계단 foundation = (Data.Config.RoomHeight / 2); location = new Data.Cord( this.Location.X + this.Size.Length - Data.Config.WallTickness, this.Location.Y + width - 10, this.Location.Z + Data.Config.FloorTickness + (Data.Config.RoomHeight / 2)); this.Components.Add(new Model.Fullstair(location, rotation, number, length, width, height, foundation, Materials[Model.ModelType.Fullstair])); //2층 계단과 연결되는 평지 foundation = 0; rotation = new Data.Rot(0, 0, 90); location = new Data.Cord(this.Location.X + this.Size.Length, this.Location.Y + Data.Config.WallTickness, this.Location.Z + Data.Config.FloorTickness + Data.Config.RoomHeight - Data.Config.FloorTickness); this.Components.Add(new Model.Fullstair(location, rotation, 1, width, width * 2, height, foundation, Materials[Model.ModelType.Fullstair])); }
//카메라가 바라보는 방향을 방의 타입에 따라, 현관은 입구를, 거실은 창을, 방은 창문을 바라본다. protected virtual void CreateCamera(int cameraNumber) { double rotation = 0; Data.Cord a = new Data.Cord(Location.X + (0.5 * Size.Length), Location.Y + (0.5 * Size.Width), Location.Z + 170); Data.SideType current = Data.SideType.Wall; foreach (Data.SideCardinalDirection sideDirection in Enum.GetValues(typeof(Data.SideCardinalDirection))) { foreach (Data.Side side in this.Sides[sideDirection]) { if (current < side.Type) { Data.Cord b = side.GetMidCord(); double y = b.Y - a.Y; double x = b.X - a.X; if (x == 0) { if (y > 0) { rotation = 90; } else { rotation = 270; } } else { rotation = (Math.Acos(y / x) * (180 / Math.PI)); if (rotation < 0) { rotation += 360; } } current = side.Type; } } } this.Components.Add(new Model.Camera(new Data.Cord(Location.X + (0.5 * Size.Length), Location.Y + (0.5 * Size.Width), Location.Z + 170), new Data.Rot(0, 0, rotation), cameraNumber)); }
public Room(Data.Size size, Dictionary <Model.ModelType, Dictionary <string, string> > materials, Dictionary <StaticCompType, string> staticComp) { id = Guid.NewGuid(); this.Location = new Data.Cord(); //this.Type = type; this.Size = size; this.Components = new List <Model.Modelable>(); this.Sides = new Dictionary <Data.SideCardinalDirection, List <Data.Side> >(); this.Materials = materials; this.StaticComponents = staticComp; foreach (Data.SideCardinalDirection sidePosition in Enum.GetValues(typeof(Data.SideCardinalDirection))) { Sides[sidePosition] = new List <Data.Side>(); } InitializeSides(); }
private void InitializeSides() { //초기화 foreach (Data.SideCardinalDirection sidePosition in Enum.GetValues(typeof(Data.SideCardinalDirection))) { Sides[sidePosition].Clear(); } //좌표계산 Data.Cord p0 = new Data.Cord(this.Location, 0, 0, 0); Data.Cord p1 = new Data.Cord(this.Location, 0, Size.Width, 0); Data.Cord p2 = new Data.Cord(this.Location, Size.Length, Size.Width, 0); Data.Cord p3 = new Data.Cord(this.Location, Size.Length, 0, 0); //좌표입력 this.Sides[Data.SideCardinalDirection.West].Add(new Data.Side(Data.SideCardinalDirection.West, Data.SideType.Wall, p0, p1)); this.Sides[Data.SideCardinalDirection.North].Add(new Data.Side(Data.SideCardinalDirection.North, Data.SideType.Wall, p1, p2)); this.Sides[Data.SideCardinalDirection.East].Add(new Data.Side(Data.SideCardinalDirection.East, Data.SideType.Wall, p2, p3)); this.Sides[Data.SideCardinalDirection.South].Add(new Data.Side(Data.SideCardinalDirection.South, Data.SideType.Wall, p3, p0)); }
public Camera(Data.Cord location, Data.Rot rotation, int cameraNumber) { this.Location = location; this.Rotation = rotation; this.CameraNumber = cameraNumber; }
//TODO: 당장은 평지붕이 올라가도록 디자인했다. private void CreateRoof() { Data.Cord location = this.Location.Clone() as Data.Cord; this.Components.Add(new Model.Flatroof(new Data.Cord(location.X - 0.01, location.Y - 0.01, location.Z + Data.Config.RoomHeight), new Data.Rot(), Data.Config.FloorTickness - 0.01, Size.Width + 0.02, Size.Length + 0.02, Materials[Model.ModelType.Flatroof])); }
private Model.Wall CreateWall(Data.Cord startPoint, Data.Cord endPoint, List <Data.Hole> holes, Dictionary <string, string> wallMat) { Model.Wall wall = new Model.Wall(startPoint, endPoint, Data.Config.WallTickness, Size.Height, holes, wallMat); return(wall); }
//TODO: 현재 삽입되는 부가적인 모델(창문이나 문 또는 가구)의 피벗(기준점) 위치가 정해지지 않아, 임시적으로 현재 언리얼에 있는 모델을 기준으로 계산되어 있다. private void CreateWalls() { foreach (Data.SideCardinalDirection sidePos in Enum.GetValues(typeof(Data.SideCardinalDirection))) { foreach (Data.Side side in Sides[sidePos]) { List <Data.Hole> holes = new List <Data.Hole>(); if (side.Type == Data.SideType.Wall) { //그냥 벽일 경우, 특정한 작업을 딱히 할 필요는 없다. } else if (side.Type == Data.SideType.Door) { double doorPos = 0; if (side.Position == Data.SideCardinalDirection.East) { doorPos = (side.End.Y - side.Start.Y) / 2.0; Model.Static door = new Model.Static( new Data.Cord(side.Start.X - Data.Config.TempStdWidDstDr, side.Start.Y + doorPos + Data.Config.DoorLength / 2, side.Start.Z + Data.Config.FloorTickness), new Data.Rot(0, 0, 90), this.StaticComponents[StaticCompType.Door] ); this.Components.Add(door); } else if (side.Position == Data.SideCardinalDirection.West) { doorPos = (side.End.Y - side.Start.Y) / 2.0; Model.Static door = new Model.Static( new Data.Cord(side.Start.X + Data.Config.TempStdWidDstDr, side.Start.Y + doorPos - Data.Config.DoorLength / 2, side.Start.Z + Data.Config.FloorTickness), new Data.Rot(0, 0, 270), this.StaticComponents[StaticCompType.Door] ); this.Components.Add(door); } else if (side.Position == Data.SideCardinalDirection.North) { doorPos = (side.End.X - side.Start.X) / 2.0; Model.Static door = new Model.Static( new Data.Cord(side.Start.X + doorPos - Data.Config.DoorLength / 2, side.Start.Y + Data.Config.TempStdWidDstDr, side.Start.Z + Data.Config.FloorTickness), new Data.Rot(0, 0, 180), this.StaticComponents[StaticCompType.Door] ); this.Components.Add(door); } else if (side.Position == Data.SideCardinalDirection.South) { doorPos = (side.End.X - side.Start.X) / 2.0; Model.Static door = new Model.Static( new Data.Cord(side.Start.X + doorPos + Data.Config.DoorLength / 2, side.Start.Y + Data.Config.TempStdWidDstDr, side.Start.Z + Data.Config.FloorTickness), new Data.Rot(0, 0, 0), this.StaticComponents[StaticCompType.Door] ); this.Components.Add(door); } Data.Hole doorHole = new Data.Hole(doorPos, Data.Config.FloorTickness + 1, Data.Config.DoorLength, Data.Config.DoorHeight); holes.Add(doorHole); } else if (side.Type == Data.SideType.Open) { //DO NOT CREATE Wall } else if (side.Type == Data.SideType.Window) { double winX = 0; double winY = Data.Config.WindowY; if (side.Position == Data.SideCardinalDirection.East) { winX = (side.End.Y - side.Start.Y) / 2.0; Model.Static window = new Model.Static( new Data.Cord(side.Start.X - Data.Config.TempStdWidDstWin, side.Start.Y + winX, side.Start.Z + winY + Data.Config.WindowHeight / 2), new Data.Rot(0, 0, 90), this.StaticComponents[StaticCompType.Window] ); this.Components.Add(window); } else if (side.Position == Data.SideCardinalDirection.West) { winX = (side.End.Y - side.Start.Y) / 2.0; Model.Static window = new Model.Static( new Data.Cord(side.Start.X + Data.Config.TempStdWidDstWin, side.Start.Y + winX, side.Start.Z + winY + Data.Config.WindowHeight / 2), new Data.Rot(0, 0, 90), this.StaticComponents[StaticCompType.Window] ); this.Components.Add(window); } else if (side.Position == Data.SideCardinalDirection.North) { winX = (side.End.X - side.Start.X) / 2.0; Model.Static window = new Model.Static( new Data.Cord(side.Start.X + winX, side.Start.Y - Data.Config.TempStdWidDstWin, side.Start.Z + winY + Data.Config.WindowHeight / 2), new Data.Rot(0, 0, 0), this.StaticComponents[StaticCompType.Window] ); this.Components.Add(window); } else if (side.Position == Data.SideCardinalDirection.South) { winX = (side.End.X - side.Start.X) / 2.0; Model.Static window = new Model.Static( new Data.Cord(side.Start.X + winX, side.Start.Y + Data.Config.TempStdWidDstWin, side.Start.Z + winY + Data.Config.WindowHeight / 2), new Data.Rot(0, 0, 0), this.StaticComponents[StaticCompType.Window] ); this.Components.Add(window); } Data.Hole windowHole = new Data.Hole(winX, winY, Data.Config.WindowLength, Data.Config.WindowHeight); holes.Add(windowHole); } else if (side.Type == Data.SideType.WindowWall) { double tempL = 270; double tempH = 250; double winX = 0; double winY = Data.Config.FloorTickness; if (side.Position == Data.SideCardinalDirection.East || side.Position == Data.SideCardinalDirection.West) { winX = (side.End.Y - side.Start.Y) / 2.0; Model.Static window1 = new Model.Static( new Data.Cord(side.Start.X, side.Start.Y + winX - tempL / 2, side.Start.Z + winY), new Data.Rot(0, 0, 90), this.StaticComponents[StaticCompType.SlideWindow] ); Model.Static window2 = new Model.Static( new Data.Cord(side.Start.X, side.Start.Y + winX + tempL / 2, side.Start.Z + winY), new Data.Rot(0, 0, 90), this.StaticComponents[StaticCompType.SlideWindow] ); this.Components.Add(window1); this.Components.Add(window2); } else if (side.Position == Data.SideCardinalDirection.North || side.Position == Data.SideCardinalDirection.South) { winX = (side.End.X - side.Start.X) / 2.0; Model.Static window1 = new Model.Static( new Data.Cord(side.Start.X + winX - tempL / 2, side.Start.Y, side.Start.Z + winY), new Data.Rot(0, 0, 0), this.StaticComponents[StaticCompType.SlideWindow] ); Model.Static window2 = new Model.Static( new Data.Cord(side.Start.X + winX + tempL / 2, side.Start.Y, side.Start.Z + winY), new Data.Rot(0, 0, 0), this.StaticComponents[StaticCompType.SlideWindow] ); this.Components.Add(window1); this.Components.Add(window2); } Data.Hole windowwallHole = new Data.Hole(winX, winY, tempL * 2, tempH); //TODO: 하드코딩되어 있는 미닫이창 크기 holes.Add(windowwallHole); } /* 다이나믹하게 생성가능한 슬라이드 윈도우를 활용하는 방법 * else if (side.Type == Data.SideType.WindowWall) * { * double winX = 0; * double winY = Data.Config.FloorTickness + Data.Config.WallTickness; * if (side.Position == Data.SideCardinalDirection.East || side.Position == Data.SideCardinalDirection.West) * { * winX = (side.End.Y - side.Start.Y) / 2.0; * * Model.Fixedwindow win = new Model.Fixedwindow( * new Data.Cord(side.Start.X - Data.Config.WallTickness / 2, side.Start.Y + winX, side.Start.Z + winY), * new Data.Rot(0, 0, 270), * new Data.Size(((winX - (Data.Config.WallTickness * 2)) * 2), Data.Config.WallTickness + 5, Data.Config.RoomHeight - (Data.Config.WallTickness * 2) - Data.Config.FloorTickness), * Data.Config.WindowFrame, * Materials[Model.ModelType.Fixedwindow] * ); * this.Components.Add(win); * } * else if (side.Position == Data.SideCardinalDirection.North || side.Position == Data.SideCardinalDirection.South) * { * winX = (side.End.X - side.Start.X) / 2.0; * * Model.Fixedwindow win = new Model.Fixedwindow( * new Data.Cord(side.Start.X + winX, side.Start.Y + Data.Config.WallTickness / 2, side.Start.Z + winY), * new Data.Rot(0, 0, 0), * new Data.Size(((winX - (Data.Config.WallTickness * 2)) * 2), Data.Config.WallTickness + 5, Data.Config.RoomHeight - (Data.Config.WallTickness * 2) - Data.Config.FloorTickness), * Data.Config.WindowFrame, * Materials[Model.ModelType.Fixedwindow] * ); * this.Components.Add(win); * } * * Data.Hole windowwallHole = new Data.Hole(winX, winY, ((winX - (Data.Config.WallTickness * 2)) * 2), Data.Config.RoomHeight - (Data.Config.WallTickness * 2) - Data.Config.FloorTickness); * holes.Add(windowwallHole); * * } */ if (side.Type != Data.SideType.Open) { //미세하게 어긋나는 계산 조정 및 Materal이 정확하게 반연되기 위한 논리 Data.Cord start = new Data.Cord(side.Start.X, side.Start.Y, side.Start.Z); Data.Cord end = new Data.Cord(side.End.X, side.End.Y, side.End.Z); //start.Z = start.Z + Data.Config.FloorTickness; //end.Z = end.Z + Data.Config.FloorTickness; if (side.Position == Data.SideCardinalDirection.East) { start.X = start.X - Data.Config.WallTickness / 2; end.X = end.X - Data.Config.WallTickness / 2; this.Components.Add(CreateWall(end, start, holes, Materials[Model.ModelType.Wall])); } else if (side.Position == Data.SideCardinalDirection.North) { start.Y = start.Y - Data.Config.WallTickness / 2; end.Y = end.Y - Data.Config.WallTickness / 2; this.Components.Add(CreateWall(start, end, holes, Materials[Model.ModelType.Wall])); } else if (side.Position == Data.SideCardinalDirection.West) { start.X = start.X + Data.Config.WallTickness / 2; end.X = end.X + Data.Config.WallTickness / 2; this.Components.Add(CreateWall(start, end, holes, Materials[Model.ModelType.Wall])); } else if (side.Position == Data.SideCardinalDirection.South) { start.Y = start.Y + Data.Config.WallTickness / 2; end.Y = end.Y + Data.Config.WallTickness / 2; this.Components.Add(CreateWall(end, start, holes, Materials[Model.ModelType.Wall])); } } } } }
public Static(Data.Cord loc, Data.Rot rot, string mesh) { this.Location = loc; this.Rotation = rot; this.Mesh = mesh; }