checkpoint
parent
df049a31cc
commit
b910181628
|
@ -271,7 +271,8 @@ var TrackballControls = function ( object, domElement ) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
mouseChange.multiplyScalar( _eye.length() * scope.panSpeed );
|
// mouseChange.multiplyScalar( _eye.length() * scope.panSpeed );
|
||||||
|
mouseChange.multiplyScalar( _eye.length() * 1/577*scope.domElement.clientWidth);
|
||||||
|
|
||||||
pan.copy( _eye ).cross( scope.object.up ).setLength( mouseChange.x );
|
pan.copy( _eye ).cross( scope.object.up ).setLength( mouseChange.x );
|
||||||
pan.add( objectUp.copy( scope.object.up ).setLength( mouseChange.y ) );
|
pan.add( objectUp.copy( scope.object.up ).setLength( mouseChange.y ) );
|
||||||
|
|
16
src/Scene.js
16
src/Scene.js
|
@ -3,7 +3,7 @@ import * as THREE from '../node_modules/three/src/Three';
|
||||||
import { Sketch } from './Sketch'
|
import { Sketch } from './Sketch'
|
||||||
import { extrude, flipBufferGeometryNormals } from './extrude'
|
import { extrude, flipBufferGeometryNormals } from './extrude'
|
||||||
import { onHover, onPick, clearSelection } from './mouseEvents';
|
import { onHover, onPick, clearSelection } from './mouseEvents';
|
||||||
import { _vec2, _vec3, color, awaitSelection, setHover } from './shared'
|
import { _vec2, _vec3, color, awaitSelection, setHover, custPtMat } from './shared'
|
||||||
import { AxesHelper } from './axes'
|
import { AxesHelper } from './axes'
|
||||||
|
|
||||||
|
|
||||||
|
@ -58,9 +58,9 @@ export class Scene {
|
||||||
|
|
||||||
this.camera.layers.enable(3)
|
this.camera.layers.enable(3)
|
||||||
|
|
||||||
const controls = new TrackballControls(this.camera, this.canvas);
|
this.controls = new TrackballControls(this.camera, this.canvas);
|
||||||
controls.target.set(0, 0, 0);
|
this.controls.target.set(0, 0, 0);
|
||||||
controls.update();
|
this.controls.update();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -82,7 +82,8 @@ export class Scene {
|
||||||
new THREE.BufferGeometry().setAttribute('position',
|
new THREE.BufferGeometry().setAttribute('position',
|
||||||
new THREE.Float32BufferAttribute(3, 3)
|
new THREE.Float32BufferAttribute(3, 3)
|
||||||
),
|
),
|
||||||
pointMaterial.clone()
|
// pointMaterial.clone()
|
||||||
|
custPtMat.clone()
|
||||||
)
|
)
|
||||||
|
|
||||||
freePt.matrixAutoUpdate = false
|
freePt.matrixAutoUpdate = false
|
||||||
|
@ -149,8 +150,8 @@ export class Scene {
|
||||||
this.awaitSelection = awaitSelection.bind(this);
|
this.awaitSelection = awaitSelection.bind(this);
|
||||||
|
|
||||||
this.obj3d.addEventListener('change', this.render);
|
this.obj3d.addEventListener('change', this.render);
|
||||||
controls.addEventListener('change', this.render);
|
this.controls.addEventListener('change', this.render);
|
||||||
controls.addEventListener('start', this.render);
|
this.controls.addEventListener('start', this.render);
|
||||||
window.addEventListener('resize', this.render);
|
window.addEventListener('resize', this.render);
|
||||||
|
|
||||||
if (process.env.NODE_ENV !== 'production') {
|
if (process.env.NODE_ENV !== 'production') {
|
||||||
|
@ -353,6 +354,7 @@ function render() {
|
||||||
this.camera.right = canvas.clientWidth / canvas.clientHeight;
|
this.camera.right = canvas.clientWidth / canvas.clientHeight;
|
||||||
this.camera.updateProjectionMatrix();
|
this.camera.updateProjectionMatrix();
|
||||||
|
|
||||||
|
this.controls.handleResize()
|
||||||
Object.assign(this.rect, this.canvas.getBoundingClientRect().toJSON())
|
Object.assign(this.rect, this.canvas.getBoundingClientRect().toJSON())
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import * as THREE from '../node_modules/three/src/Three';
|
import * as THREE from '../node_modules/three/src/Three';
|
||||||
|
|
||||||
import { _vec2, _vec3, raycaster, awaitSelection, ptObj, setHover } from './shared'
|
import { _vec2, _vec3, raycaster, awaitSelection, ptObj, setHover,custPtMat } from './shared'
|
||||||
|
|
||||||
import { drawOnClick1, drawOnClick2, drawPreClick2, drawOnClick3, drawPreClick3, drawClear, drawPoint } from './drawEvents'
|
import { drawOnClick1, drawOnClick2, drawPreClick2, drawOnClick3, drawPreClick3, drawClear, drawPoint } from './drawEvents'
|
||||||
import { onHover, onDrag, onPick, onRelease, clearSelection } from './mouseEvents'
|
import { onHover, onDrag, onPick, onRelease, clearSelection } from './mouseEvents'
|
||||||
|
@ -47,8 +47,20 @@ class Sketch {
|
||||||
this.constraints = new Map()
|
this.constraints = new Map()
|
||||||
this.c_id = 1;
|
this.c_id = 1;
|
||||||
|
|
||||||
this.obj3d.add(new THREE.Group());
|
this.helpersGroup = new THREE.Group()
|
||||||
|
this.obj3d.add(this.helpersGroup);
|
||||||
|
// this.freePt = new THREE.Points(
|
||||||
|
// new THREE.BufferGeometry().setAttribute('position',
|
||||||
|
// new THREE.Float32BufferAttribute(3, 3)
|
||||||
|
// ),
|
||||||
|
// custPtMat.clone()
|
||||||
|
// )
|
||||||
|
// this.freePt.matrixAutoUpdate = false
|
||||||
|
// this.freePt.visible = false
|
||||||
|
// this.freePt.userData.type = 'selpoint'
|
||||||
|
// this.helpersGroup.add(this.freePt);
|
||||||
|
|
||||||
|
this.obj3d.add(new THREE.Group());
|
||||||
this.geomStartIdx = this.obj3d.children.length
|
this.geomStartIdx = this.obj3d.children.length
|
||||||
this.obj3d.userData.geomStartIdx = this.geomStartIdx
|
this.obj3d.userData.geomStartIdx = this.geomStartIdx
|
||||||
this.dimGroup = this.obj3d.children[this.geomStartIdx - 1]
|
this.dimGroup = this.obj3d.children[this.geomStartIdx - 1]
|
||||||
|
@ -258,7 +270,7 @@ class Sketch {
|
||||||
case 'p':
|
case 'p':
|
||||||
this.mode = "point"
|
this.mode = "point"
|
||||||
this.snap = true
|
this.snap = true
|
||||||
this.canvas.addEventListener('pointerdown', (e)=> {
|
this.canvas.addEventListener('pointerdown', (e) => {
|
||||||
if (this.mode !== 'point') return
|
if (this.mode !== 'point') return
|
||||||
const pt = ptObj()
|
const pt = ptObj()
|
||||||
|
|
||||||
|
@ -271,7 +283,7 @@ class Sketch {
|
||||||
pt.layers.enable(2)
|
pt.layers.enable(2)
|
||||||
|
|
||||||
this.obj3d.add(pt)
|
this.obj3d.add(pt)
|
||||||
this.updatePointsBuffer(this.obj3d.children.length-1)
|
this.updatePointsBuffer(this.obj3d.children.length - 1)
|
||||||
this.scene.render()
|
this.scene.render()
|
||||||
})
|
})
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -3,15 +3,26 @@ import { drawArc, drawArc2, drawArc3, drawArc4 } from './drawArc'
|
||||||
import { drawLine, drawLine2 } from './drawLine'
|
import { drawLine, drawLine2 } from './drawLine'
|
||||||
import { ptObj } from './shared'
|
import { ptObj } from './shared'
|
||||||
|
|
||||||
export function drawOnClick1(e) {
|
export function drawOnClick1(e, loc) {
|
||||||
if (e.buttons !== 1) return
|
if (!loc && e.buttons !== 1) return
|
||||||
|
|
||||||
// this.canvas.removeEventListener('pointerdown', this.drawOnClick1)
|
// this.canvas.removeEventListener('pointerdown', this.drawOnClick1)
|
||||||
|
|
||||||
this.canvas.addEventListener('pointermove', this.drawPreClick2)
|
this.canvas.addEventListener('pointermove', this.drawPreClick2)
|
||||||
this.canvas.addEventListener('pointerdown', this.drawOnClick2, { once: true })
|
this.canvas.addEventListener('pointerdown', this.drawOnClick2, { once: true })
|
||||||
|
|
||||||
const mouseLoc = this.getLocation(e).toArray();
|
|
||||||
|
let mouseLoc
|
||||||
|
|
||||||
|
if (loc) {
|
||||||
|
mouseLoc = loc
|
||||||
|
} else if (this.hovered.length && !this.subsequent) {
|
||||||
|
mouseLoc = this.hovered[this.hovered.length - 1].geometry.attributes.position.array
|
||||||
|
} else {
|
||||||
|
mouseLoc = this.getLocation(e).toArray();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// this.mode allow alow following modes to create new obj3ds
|
// this.mode allow alow following modes to create new obj3ds
|
||||||
if (this.mode == "line") {
|
if (this.mode == "line") {
|
||||||
|
@ -83,6 +94,7 @@ export function drawOnClick2(e) {
|
||||||
element.layers.enable(2)
|
element.layers.enable(2)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let modLoc
|
||||||
if (this.hovered.length) {
|
if (this.hovered.length) {
|
||||||
this.constraints.set(++this.c_id,
|
this.constraints.set(++this.c_id,
|
||||||
[
|
[
|
||||||
|
@ -94,14 +106,22 @@ export function drawOnClick2(e) {
|
||||||
this.toPush[1].userData.constraints.push(this.c_id)
|
this.toPush[1].userData.constraints.push(this.c_id)
|
||||||
this.updateOtherBuffers()
|
this.updateOtherBuffers()
|
||||||
|
|
||||||
|
modLoc = this.hovered[this.hovered.length - 1].geometry.attributes.position.array
|
||||||
}
|
}
|
||||||
|
|
||||||
if (this.mode == "line") {
|
if (this.mode == "line") {
|
||||||
|
|
||||||
this.subsequent = true
|
this.subsequent = true
|
||||||
this.drawOnClick1(e)
|
if (modLoc) {
|
||||||
|
drawLine2(modLoc, this.toPush)
|
||||||
|
this.drawOnClick1(null, modLoc)
|
||||||
|
} else {
|
||||||
|
this.drawOnClick1(e)
|
||||||
|
}
|
||||||
|
|
||||||
} else if (this.mode == "arc") {
|
} else if (this.mode == "arc") {
|
||||||
|
if (modLoc) {
|
||||||
|
drawArc2(modLoc, this.toPush)
|
||||||
|
}
|
||||||
|
|
||||||
drawArc3(this.toPush[0], this.toPush[1])
|
drawArc3(this.toPush[0], this.toPush[1])
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ export function extrude(sketch, depth) {
|
||||||
linkedObj[1][nextIdx]
|
linkedObj[1][nextIdx]
|
||||||
)
|
)
|
||||||
]
|
]
|
||||||
if (d == children[2]) {
|
if (d == children[sketch.geomStartIdx + 1]) {
|
||||||
// console.log('pair found')
|
// console.log('pair found')
|
||||||
};
|
};
|
||||||
findTouching(d)
|
findTouching(d)
|
||||||
|
@ -58,7 +58,7 @@ export function extrude(sketch, depth) {
|
||||||
if (c == -1) continue;
|
if (c == -1) continue;
|
||||||
const d = children[objIdx.get(c)]
|
const d = children[objIdx.get(c)]
|
||||||
if (d == node) continue;
|
if (d == node) continue;
|
||||||
if (d == children[2]) {
|
if (d == children[sketch.geomStartIdx + 1]) {
|
||||||
// console.log('loop found')
|
// console.log('loop found')
|
||||||
} else {
|
} else {
|
||||||
// if (!visited.has(d)) {
|
// if (!visited.has(d)) {
|
||||||
|
|
|
@ -24,6 +24,8 @@ export function onHover(e) {
|
||||||
raycaster.layers.set(1)
|
raycaster.layers.set(1)
|
||||||
hoverPts = raycaster.intersectObjects(this.obj3d.children, true)
|
hoverPts = raycaster.intersectObjects(this.obj3d.children, true)
|
||||||
} else {
|
} else {
|
||||||
|
// this.freePt.visible = false // hide freept before each redraw
|
||||||
|
this.scene.selpoints[0].visible = false // hide selpoint[0] before each redraw
|
||||||
raycaster.layers.set(2)
|
raycaster.layers.set(2)
|
||||||
// intersectObjects has side effect of updating bounding spheres
|
// intersectObjects has side effect of updating bounding spheres
|
||||||
// which may lead to unexpected results if you leave boundspheres un-updated
|
// which may lead to unexpected results if you leave boundspheres un-updated
|
||||||
|
@ -77,7 +79,7 @@ export function onHover(e) {
|
||||||
if (this.obj3d.userData.type != 'sketch' && obj.userData.type == 'point') {
|
if (this.obj3d.userData.type != 'sketch' && obj.userData.type == 'point') {
|
||||||
ptLoc = obj.geometry.attributes.position.array
|
ptLoc = obj.geometry.attributes.position.array
|
||||||
.slice(
|
.slice(
|
||||||
3 * hoverts[idx[x]].index,
|
3 * hoverPts[idx[x]].index,
|
||||||
3 * hoverPts[idx[x]].index + 3
|
3 * hoverPts[idx[x]].index + 3
|
||||||
)
|
)
|
||||||
this.selpoints[0].geometry.attributes.position.array.set(ptLoc)
|
this.selpoints[0].geometry.attributes.position.array.set(ptLoc)
|
||||||
|
@ -88,6 +90,28 @@ export function onHover(e) {
|
||||||
obj = hoverPts[idx[x]].index
|
obj = hoverPts[idx[x]].index
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this.obj3d.userData.type == 'sketch' && obj.userData.type == 'point') {
|
||||||
|
// ptLoc = obj.geometry.attributes.position.array
|
||||||
|
// .slice(
|
||||||
|
// 3 * hoverPts[idx[x]].index,
|
||||||
|
// 3 * hoverPts[idx[x]].index + 3
|
||||||
|
// )
|
||||||
|
// this.freePt.geometry.attributes.position.array.set(ptLoc)
|
||||||
|
// this.freePt.matrix = obj.parent.matrix
|
||||||
|
// this.freePt.geometry.attributes.position.needsUpdate = true
|
||||||
|
// this.freePt.visible = true
|
||||||
|
ptLoc = obj.geometry.attributes.position.array
|
||||||
|
.slice(
|
||||||
|
3 * hoverPts[idx[x]].index,
|
||||||
|
3 * hoverPts[idx[x]].index + 3
|
||||||
|
)
|
||||||
|
this.scene.selpoints[0].geometry.attributes.position.array.set(ptLoc)
|
||||||
|
this.scene.selpoints[0].matrix = obj.parent.matrix
|
||||||
|
this.scene.selpoints[0].geometry.attributes.position.needsUpdate = true
|
||||||
|
this.scene.selpoints[0].visible = true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
this.hovered.push(obj)
|
this.hovered.push(obj)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,6 +149,7 @@ export function onPick(e) {
|
||||||
let obj = this.hovered[this.hovered.length - 1]
|
let obj = this.hovered[this.hovered.length - 1]
|
||||||
// if (sc.selected.includes(obj3d)) continue
|
// if (sc.selected.includes(obj3d)) continue
|
||||||
|
|
||||||
|
console.log(obj, 'heere')
|
||||||
if (typeof obj != 'object') { // special sketchplace define pts in feature mode
|
if (typeof obj != 'object') { // special sketchplace define pts in feature mode
|
||||||
|
|
||||||
const pp = this.selpoints[this.fptIdx % 3 + 1]
|
const pp = this.selpoints[this.fptIdx % 3 + 1]
|
||||||
|
@ -205,10 +230,12 @@ export function onPick(e) {
|
||||||
for (let x = 0; x < this.selected.length; x++) {
|
for (let x = 0; x < this.selected.length; x++) {
|
||||||
const obj = this.selected[x]
|
const obj = this.selected[x]
|
||||||
|
|
||||||
setHover(obj, 0)
|
|
||||||
|
|
||||||
if (obj.userData.type == 'selpoint') {
|
if (obj.userData.type == 'selpoint') {
|
||||||
obj.visible = false
|
obj.visible = false
|
||||||
|
} else {
|
||||||
|
setHover(obj, 0)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// dont think this would have been possible without redux
|
// dont think this would have been possible without redux
|
||||||
|
|
|
@ -179,8 +179,61 @@ function setHover(obj, state, meshHover = true) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
const vertexShader = `
|
||||||
|
uniform float edgeSize;
|
||||||
|
uniform float pointWidth;
|
||||||
|
void main() {
|
||||||
|
vec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );
|
||||||
|
gl_PointSize = (pointWidth + edgeSize);
|
||||||
|
gl_Position = projectionMatrix * mvPosition;
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
const fragmentShader = `
|
||||||
|
uniform vec3 color;
|
||||||
|
uniform vec3 edgeColor;
|
||||||
|
uniform float edgeSize;
|
||||||
|
uniform float pointWidth;
|
||||||
|
void main() {
|
||||||
|
gl_FragColor = vec4(color, 1.0);
|
||||||
|
// distance = len(x: [-1, 1], y: [-1, 1])
|
||||||
|
float distance = length(2.0 * gl_PointCoord - 1.0);
|
||||||
|
// pixels [0, ~15/20]
|
||||||
|
float totalWidth = pointWidth + edgeSize;
|
||||||
|
float edgeStart = pointWidth;
|
||||||
|
float edgeEnd = pointWidth + 2.0;
|
||||||
|
// [edgeStart, edgeEnd] -> [0, 1]
|
||||||
|
float sEdge = smoothstep(edgeStart, edgeEnd, distance * totalWidth);
|
||||||
|
// transition from edgeColor to color along the edge
|
||||||
|
gl_FragColor = ( vec4(edgeColor, 1.0) * sEdge) + ((1.0 - sEdge) * gl_FragColor);
|
||||||
|
|
||||||
|
if (distance > 1.0) {
|
||||||
|
discard;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
const pixelRatio = 2
|
||||||
|
const custPtMat = new THREE.ShaderMaterial({
|
||||||
|
uniforms: {
|
||||||
|
color: { value: new THREE.Color(0xff0000) },
|
||||||
|
edgeColor: { value: new THREE.Color(0x990000) },
|
||||||
|
pointWidth: { value: 4 * pixelRatio },
|
||||||
|
edgeSize: { value: 4 * pixelRatio },
|
||||||
|
},
|
||||||
|
vertexShader,
|
||||||
|
fragmentShader,
|
||||||
|
// depthTest:false
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
window.rc = raycaster
|
window.rc = raycaster
|
||||||
|
|
||||||
|
|
||||||
export { lineMaterial, pointMaterial, _vec2, _vec3, raycaster, color, hoverColor, ptObj, lineObj, awaitSelection, setHover }
|
export { lineMaterial, pointMaterial, custPtMat, _vec2, _vec3, raycaster, color, hoverColor, ptObj, lineObj, awaitSelection, setHover }
|
Loading…
Reference in New Issue