summaryrefslogtreecommitdiff
path: root/server/lib/api/rooms.js
blob: 2a1d2fe808768343dfeec81c2344ccaddd542e00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
var vec = require("../../../public/assets/javascripts/rectangles/models/vec2.js")
var Rect = require("../../../public/assets/javascripts/rectangles/models/rect.js")
var Room = require("../../../public/assets/javascripts/rectangles/models/room.js")
var Rooms = require("../../../public/assets/javascripts/rectangles/engine/rooms/_rooms.js")
var Clipper = require("../../../public/assets/javascripts/rectangles/engine/rooms/clipper.js")
var Builder = require("../../../public/assets/javascripts/rectangles/engine/rooms/builder.js")
var Grouper = require("../../../public/assets/javascripts/rectangles/engine/rooms/grouper.js")
var Walls = require("../../../public/assets/javascripts/rectangles/engine/rooms/_walls.js")
var shapes = require("../../../public/assets/javascripts/rectangles/engine/shapes/shapelist.js")
var RegionList = require("../../../public/assets/javascripts/rectangles/engine/shapes/regionlist.js")

/* jshint node: true */

var _ = require('lodash'),
	util = require('../util'),
	upload = require('../upload'),
	config = require('../../../config.json'),
	Project = require('../schemas/Project');

var rooms = module.exports = {
  show: function(req, res){
		Project.findOne({ slug: req.params.slug }, function(err, doc){
			if (! doc) { res.json({ status: 404 }); return }
			doc = doc.toObject()

      if (doc.shapes.length) {
        parseMxShapes(doc)
      }
      else {
        parseMxRooms(doc)
      }

      res.json(doc)
		})
	}
}

function parseMxShapes (doc) {
  var viewHeight = doc.viewHeight
  var wallHeight = doc.wallHeight

  shapes.deserialize( doc.shapes )

  var walls = [], mx_walls = [], mx_floor = [], mx_ceiling = []
  var regions = RegionList.build()
  
  regions.forEach(function(region){
    var room = new Room({
      rect: region,
      regions: [region],
      height: wallHeight,
    })

    room.sides = region.sides
    region.id = Rooms.uid("room_")
    Rooms.list[ region.id ] = room
    Rooms.builder.build_walls(region)
    mx_floor.push( Rooms.builder.make_floor(room, region) )
    mx_ceiling.push( Rooms.builder.make_ceiling(room, region) )
  })

  var collections = Rooms.grouper.collect()
  Rooms.grouper.cull(collections)
  Rooms.grouper.group(walls, collections, FRONT)
  Rooms.grouper.group(walls, collections, BACK)
  Rooms.grouper.group(walls, collections, LEFT)
  Rooms.grouper.group(walls, collections, RIGHT)
  walls.forEach(function(wall){
    wall.mx.forEach(function(mx){
      var data = mx.report()
      data.id = wall.id
      mx_walls.push(data)
    })
  })

  doc.mx_walls = mx_walls
  doc.mx_floor = mx_floor
  doc.mx_ceiling = mx_ceiling

  Rooms.forEach(function(room){
    mx_floor.push( room.mx_floor )
    room.mx_ceiling.forEach(function(mx){
      mx_ceiling.push( mx.report() )
    })
  })
}

function parseMxRooms (doc) {
  doc.rooms.forEach(function(data){
    var rect = new Rect(data.rect.x[0], data.rect.y[0], data.rect.x[1], data.rect.y[1])
    var room = new Room({
      id: data.id,
      rect: rect,
      height: data.height
    })
    Rooms.add(room)
  })
  Rooms.clipper.solve_rects()
  Rooms.builder.build()

  var walls = [], mx_walls = [], mx_floor = [], mx_ceiling = []
  var collections = Rooms.grouper.collect()
  Rooms.grouper.cull(collections)
  Rooms.grouper.group(walls, collections, FRONT)
  Rooms.grouper.group(walls, collections, BACK)
  Rooms.grouper.group(walls, collections, LEFT)
  Rooms.grouper.group(walls, collections, RIGHT)
  walls.forEach(function(wall){
    wall.mx.forEach(function(mx){
      var data = mx.report()
      data.id = wall.id
      mx_walls.push(data)
    })
  })

  doc.mx_walls = mx_walls
  doc.mx_floor = mx_floor
  doc.mx_ceiling = mx_ceiling
  
  Rooms.forEach(function(room){
    room.mx_floor.forEach(function(mx){
      mx_floor.push( mx.report() )
    })
    room.mx_ceiling.forEach(function(mx){
      mx_ceiling.push( mx.report() )
    })
  })
}