added elevator
This commit is contained in:
@@ -99,3 +99,23 @@ section[role="main-content"]{
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.elevator{
|
||||||
|
position: absolute;
|
||||||
|
right:0;
|
||||||
|
top:43%;
|
||||||
|
ul{
|
||||||
|
padding:1em;
|
||||||
|
background-color: rgba(255, 255, 255, 0.6);
|
||||||
|
li{
|
||||||
|
padding:0.25em 0;
|
||||||
|
text-align: right;
|
||||||
|
min-width: 5em;
|
||||||
|
cursor: pointer;
|
||||||
|
&:hover, &.active{
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+20
-5
@@ -41,6 +41,7 @@
|
|||||||
v-for="(project) in projects"
|
v-for="(project) in projects"
|
||||||
:id="project.id"
|
:id="project.id"
|
||||||
:key="project.id"
|
:key="project.id"
|
||||||
|
@lift="onLift"
|
||||||
/>
|
/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@@ -245,9 +246,9 @@ export default {
|
|||||||
this.updatedInteractiveObjects()
|
this.updatedInteractiveObjects()
|
||||||
// CONTROLS
|
// CONTROLS
|
||||||
// https://blogs.perficient.com/2020/05/21/3d-camera-movement-in-three-js-i-learned-the-hard-way-so-you-dont-have-to/
|
// https://blogs.perficient.com/2020/05/21/3d-camera-movement-in-three-js-i-learned-the-hard-way-so-you-dont-have-to/
|
||||||
document.addEventListener('mousedown', this.onDocMouseDown, false)
|
document.addEventListener('mousedown', this.onDocMouseDown)
|
||||||
document.addEventListener('mousemove', this.onDocMouseMove, false)
|
document.addEventListener('mousemove', this.onDocMouseMove)
|
||||||
document.addEventListener('mouseup', this.onDocMouseup, false)
|
document.addEventListener('mouseup', this.onDocMouseup)
|
||||||
},
|
},
|
||||||
updated () {
|
updated () {
|
||||||
this.updatedInteractiveObjects()
|
this.updatedInteractiveObjects()
|
||||||
@@ -295,7 +296,8 @@ export default {
|
|||||||
this.controls.user_interact = false
|
this.controls.user_interact = false
|
||||||
|
|
||||||
// check if event is not a classic html link
|
// check if event is not a classic html link
|
||||||
if (e.target.className === 'close-btn') {
|
// TODO: stopPropagation instead of that (but it does not work)
|
||||||
|
if (e.target.className === 'close-btn' || e.target.className === 'btn-level') {
|
||||||
// console.log('close-btn: vnode', this.opened_vnode)
|
// console.log('close-btn: vnode', this.opened_vnode)
|
||||||
// this.opened_vnode.isOpened = false
|
// this.opened_vnode.isOpened = false
|
||||||
return
|
return
|
||||||
@@ -315,7 +317,7 @@ export default {
|
|||||||
// if we clicked on 3Dobject
|
// if we clicked on 3Dobject
|
||||||
if (intersects.length) {
|
if (intersects.length) {
|
||||||
let cam = this.camera
|
let cam = this.camera
|
||||||
console.log('onDocMouseUp intersects', intersects)
|
// console.log('onDocMouseUp intersects', intersects)
|
||||||
let object = intersects[0].object
|
let object = intersects[0].object
|
||||||
console.log('object[0]', object)
|
console.log('object[0]', object)
|
||||||
let vnode = object.userData.vnode
|
let vnode = object.userData.vnode
|
||||||
@@ -388,6 +390,19 @@ export default {
|
|||||||
}
|
}
|
||||||
} // end if dragging
|
} // end if dragging
|
||||||
},
|
},
|
||||||
|
onLift (toPos) {
|
||||||
|
console.log('onLift', toPos)
|
||||||
|
let cam = this.camera
|
||||||
|
let camPos = { ...cam.position }
|
||||||
|
new TWEEN.Tween(camPos)
|
||||||
|
.easing(TWEEN.Easing.Quadratic.InOut)
|
||||||
|
.to(toPos, 3000)
|
||||||
|
.onUpdate(function () {
|
||||||
|
// console.log('tween update', this._object)
|
||||||
|
cam.position.set(this._object.x, this._object.y, this._object.z)
|
||||||
|
})
|
||||||
|
.start()
|
||||||
|
},
|
||||||
animate (tt) {
|
animate (tt) {
|
||||||
// CONTROLS
|
// CONTROLS
|
||||||
if (this.controls.user_interact) {
|
if (this.controls.user_interact) {
|
||||||
|
|||||||
@@ -39,13 +39,49 @@
|
|||||||
:prtId="id"
|
:prtId="id"
|
||||||
:data="item"
|
:data="item"
|
||||||
/>
|
/>
|
||||||
|
<div class="elevator">
|
||||||
|
<ul>
|
||||||
|
<li :class="{ active: levelVisibles }">
|
||||||
|
<a
|
||||||
|
class="btn-level"
|
||||||
|
href="#visibles"
|
||||||
|
@click.stop="onClickLevel('visibles', $event)"
|
||||||
|
@keyup.enter="onClickLevel('visibles')"
|
||||||
|
>Visibles</a>
|
||||||
|
</li>
|
||||||
|
<li :class="{ active: levelContexts }">
|
||||||
|
<a
|
||||||
|
class="btn-level"
|
||||||
|
href="#contexts"
|
||||||
|
@click.stop="onClickLevel('contexts', $event)"
|
||||||
|
@keyup.enter="onClickLevel('contexts')"
|
||||||
|
>Contexts</a>
|
||||||
|
</li>
|
||||||
|
<li :class="{ active: levelProcesses }">
|
||||||
|
<a
|
||||||
|
class="btn-level"
|
||||||
|
href="#processes"
|
||||||
|
@click.stop="onClickLevel('processes', $event)"
|
||||||
|
@keyup.enter="onClickLevel('processes')"
|
||||||
|
>Processes</a>
|
||||||
|
</li>
|
||||||
|
<li :class="{ active: levelConcepts }">
|
||||||
|
<a
|
||||||
|
class="btn-level"
|
||||||
|
href="#concepts"
|
||||||
|
@click.stop="onClickLevel('concepts', $event)"
|
||||||
|
@keyup.enter="onClickLevel('concepts')"
|
||||||
|
>Concepts</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
import { mapInstanceState, mapInstanceActions } from '@urbn/vuex-helpers'
|
import { mapInstanceState, mapInstanceActions, mapInstanceMutations } from '@urbn/vuex-helpers'
|
||||||
|
|
||||||
import * as THREE from 'three'
|
import * as THREE from 'three'
|
||||||
// import { ThreeBSP } from 'three-js-csg-es6'
|
// import { ThreeBSP } from 'three-js-csg-es6'
|
||||||
@@ -102,7 +138,8 @@ export default {
|
|||||||
floorPos: state => state.floorPos,
|
floorPos: state => state.floorPos,
|
||||||
levels3dObj: state => state.levels3dObj,
|
levels3dObj: state => state.levels3dObj,
|
||||||
levelsPos: state => state.levelsPos,
|
levelsPos: state => state.levelsPos,
|
||||||
contents: state => state.contents
|
contents: state => state.contents,
|
||||||
|
activeLevel: state => state.activeLevel
|
||||||
}),
|
}),
|
||||||
label_texture_opts () {
|
label_texture_opts () {
|
||||||
return {
|
return {
|
||||||
@@ -111,6 +148,18 @@ export default {
|
|||||||
wrapS: THREE.ClampToEdgeWrapping,
|
wrapS: THREE.ClampToEdgeWrapping,
|
||||||
wrapT: THREE.ClampToEdgeWrapping
|
wrapT: THREE.ClampToEdgeWrapping
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
levelVisibles () {
|
||||||
|
return this.activeLevel === 'visibles'
|
||||||
|
},
|
||||||
|
levelContexts () {
|
||||||
|
return this.activeLevel === 'contexts'
|
||||||
|
},
|
||||||
|
levelProcesses () {
|
||||||
|
return this.activeLevel === 'processes'
|
||||||
|
},
|
||||||
|
levelConcepts () {
|
||||||
|
return this.activeLevel === 'concepts'
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
created () {
|
created () {
|
||||||
@@ -132,9 +181,36 @@ export default {
|
|||||||
...mapInstanceActions(getModuleName, {
|
...mapInstanceActions(getModuleName, {
|
||||||
loadContents: 'loadContents'
|
loadContents: 'loadContents'
|
||||||
}),
|
}),
|
||||||
|
...mapInstanceMutations(getModuleName, {
|
||||||
|
setActiveLevel: 'setActiveLevel'
|
||||||
|
}),
|
||||||
open () {
|
open () {
|
||||||
this.isOpened = true
|
if (!this.isOpened) {
|
||||||
this.loadContents()
|
this.isOpened = true
|
||||||
|
this.loadContents()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onClickLevel (level, e) {
|
||||||
|
// e.stopPropagation()
|
||||||
|
e.preventDefault()
|
||||||
|
console.log('onclickLevel', level)
|
||||||
|
this.setActiveLevel(level)
|
||||||
|
let toPos = { ...this.position }
|
||||||
|
switch (level) {
|
||||||
|
case 'visibles':
|
||||||
|
toPos.y = 2
|
||||||
|
break
|
||||||
|
case 'contexts':
|
||||||
|
toPos.y = -1 * this.size.y * 0.25 + 2
|
||||||
|
break
|
||||||
|
case 'processes':
|
||||||
|
toPos.y = -2 * this.size.y * 0.25 + 2
|
||||||
|
break
|
||||||
|
case 'concepts':
|
||||||
|
toPos.y = -3 * this.size.y * 0.25 + 2
|
||||||
|
break
|
||||||
|
}
|
||||||
|
this.$emit('lift', toPos)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,8 @@ export default {
|
|||||||
contents_size_factor: 2, // factor to get the contents (grid) size proportional to windows
|
contents_size_factor: 2, // factor to get the contents (grid) size proportional to windows
|
||||||
contentTypes: ['visible', 'context', 'process', 'concept'],
|
contentTypes: ['visible', 'context', 'process', 'concept'],
|
||||||
grid: { visible: [], context: [], process: [], concept: [] },
|
grid: { visible: [], context: [], process: [], concept: [] },
|
||||||
gridContentPlaced: {}
|
gridContentPlaced: {},
|
||||||
|
activeLevel: 'visibles'
|
||||||
},
|
},
|
||||||
|
|
||||||
// getters
|
// getters
|
||||||
@@ -94,6 +95,9 @@ export default {
|
|||||||
state.gridContentPlaced[c.type] = {}
|
state.gridContentPlaced[c.type] = {}
|
||||||
}
|
}
|
||||||
state.gridContentPlaced[c.type][c.id] = p
|
state.gridContentPlaced[c.type][c.id] = p
|
||||||
|
},
|
||||||
|
setActiveLevel: (state, l) => {
|
||||||
|
state.activeLevel = l
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user