Game
- Create class "player"
This commit is contained in:
180
site/real_game/node_modules/three/src/geometries/BoxGeometry.js
generated
vendored
Normal file
180
site/real_game/node_modules/three/src/geometries/BoxGeometry.js
generated
vendored
Normal file
@ -0,0 +1,180 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
class BoxGeometry extends BufferGeometry {
|
||||
|
||||
constructor( width = 1, height = 1, depth = 1, widthSegments = 1, heightSegments = 1, depthSegments = 1 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'BoxGeometry';
|
||||
|
||||
this.parameters = {
|
||||
width: width,
|
||||
height: height,
|
||||
depth: depth,
|
||||
widthSegments: widthSegments,
|
||||
heightSegments: heightSegments,
|
||||
depthSegments: depthSegments
|
||||
};
|
||||
|
||||
const scope = this;
|
||||
|
||||
// segments
|
||||
|
||||
widthSegments = Math.floor( widthSegments );
|
||||
heightSegments = Math.floor( heightSegments );
|
||||
depthSegments = Math.floor( depthSegments );
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// helper variables
|
||||
|
||||
let numberOfVertices = 0;
|
||||
let groupStart = 0;
|
||||
|
||||
// build each side of the box geometry
|
||||
|
||||
buildPlane( 'z', 'y', 'x', - 1, - 1, depth, height, width, depthSegments, heightSegments, 0 ); // px
|
||||
buildPlane( 'z', 'y', 'x', 1, - 1, depth, height, - width, depthSegments, heightSegments, 1 ); // nx
|
||||
buildPlane( 'x', 'z', 'y', 1, 1, width, depth, height, widthSegments, depthSegments, 2 ); // py
|
||||
buildPlane( 'x', 'z', 'y', 1, - 1, width, depth, - height, widthSegments, depthSegments, 3 ); // ny
|
||||
buildPlane( 'x', 'y', 'z', 1, - 1, width, height, depth, widthSegments, heightSegments, 4 ); // pz
|
||||
buildPlane( 'x', 'y', 'z', - 1, - 1, width, height, - depth, widthSegments, heightSegments, 5 ); // nz
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
function buildPlane( u, v, w, udir, vdir, width, height, depth, gridX, gridY, materialIndex ) {
|
||||
|
||||
const segmentWidth = width / gridX;
|
||||
const segmentHeight = height / gridY;
|
||||
|
||||
const widthHalf = width / 2;
|
||||
const heightHalf = height / 2;
|
||||
const depthHalf = depth / 2;
|
||||
|
||||
const gridX1 = gridX + 1;
|
||||
const gridY1 = gridY + 1;
|
||||
|
||||
let vertexCounter = 0;
|
||||
let groupCount = 0;
|
||||
|
||||
const vector = new Vector3();
|
||||
|
||||
// generate vertices, normals and uvs
|
||||
|
||||
for ( let iy = 0; iy < gridY1; iy ++ ) {
|
||||
|
||||
const y = iy * segmentHeight - heightHalf;
|
||||
|
||||
for ( let ix = 0; ix < gridX1; ix ++ ) {
|
||||
|
||||
const x = ix * segmentWidth - widthHalf;
|
||||
|
||||
// set values to correct vector component
|
||||
|
||||
vector[ u ] = x * udir;
|
||||
vector[ v ] = y * vdir;
|
||||
vector[ w ] = depthHalf;
|
||||
|
||||
// now apply vector to vertex buffer
|
||||
|
||||
vertices.push( vector.x, vector.y, vector.z );
|
||||
|
||||
// set values to correct vector component
|
||||
|
||||
vector[ u ] = 0;
|
||||
vector[ v ] = 0;
|
||||
vector[ w ] = depth > 0 ? 1 : - 1;
|
||||
|
||||
// now apply vector to normal buffer
|
||||
|
||||
normals.push( vector.x, vector.y, vector.z );
|
||||
|
||||
// uvs
|
||||
|
||||
uvs.push( ix / gridX );
|
||||
uvs.push( 1 - ( iy / gridY ) );
|
||||
|
||||
// counters
|
||||
|
||||
vertexCounter += 1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// indices
|
||||
|
||||
// 1. you need three indices to draw a single face
|
||||
// 2. a single segment consists of two faces
|
||||
// 3. so we need to generate six (2*3) indices per segment
|
||||
|
||||
for ( let iy = 0; iy < gridY; iy ++ ) {
|
||||
|
||||
for ( let ix = 0; ix < gridX; ix ++ ) {
|
||||
|
||||
const a = numberOfVertices + ix + gridX1 * iy;
|
||||
const b = numberOfVertices + ix + gridX1 * ( iy + 1 );
|
||||
const c = numberOfVertices + ( ix + 1 ) + gridX1 * ( iy + 1 );
|
||||
const d = numberOfVertices + ( ix + 1 ) + gridX1 * iy;
|
||||
|
||||
// faces
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( b, c, d );
|
||||
|
||||
// increase counter
|
||||
|
||||
groupCount += 6;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// add a group to the geometry. this will ensure multi material support
|
||||
|
||||
scope.addGroup( groupStart, groupCount, materialIndex );
|
||||
|
||||
// calculate new start value for groups
|
||||
|
||||
groupStart += groupCount;
|
||||
|
||||
// update total number of vertices
|
||||
|
||||
numberOfVertices += vertexCounter;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new BoxGeometry( data.width, data.height, data.depth, data.widthSegments, data.heightSegments, data.depthSegments );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { BoxGeometry };
|
33
site/real_game/node_modules/three/src/geometries/CapsuleGeometry.js
generated
vendored
Normal file
33
site/real_game/node_modules/three/src/geometries/CapsuleGeometry.js
generated
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
import { Path } from '../extras/core/Path.js';
|
||||
import { LatheGeometry } from './LatheGeometry.js';
|
||||
|
||||
class CapsuleGeometry extends LatheGeometry {
|
||||
|
||||
constructor( radius = 1, length = 1, capSegments = 4, radialSegments = 8 ) {
|
||||
|
||||
const path = new Path();
|
||||
path.absarc( 0, - length / 2, radius, Math.PI * 1.5, 0 );
|
||||
path.absarc( 0, length / 2, radius, 0, Math.PI * 0.5 );
|
||||
|
||||
super( path.getPoints( capSegments ), radialSegments );
|
||||
|
||||
this.type = 'CapsuleGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
length: length,
|
||||
capSegments: capSegments,
|
||||
radialSegments: radialSegments,
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new CapsuleGeometry( data.radius, data.length, data.capSegments, data.radialSegments );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { CapsuleGeometry };
|
101
site/real_game/node_modules/three/src/geometries/CircleGeometry.js
generated
vendored
Normal file
101
site/real_game/node_modules/three/src/geometries/CircleGeometry.js
generated
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
|
||||
class CircleGeometry extends BufferGeometry {
|
||||
|
||||
constructor( radius = 1, segments = 32, thetaStart = 0, thetaLength = Math.PI * 2 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'CircleGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
segments: segments,
|
||||
thetaStart: thetaStart,
|
||||
thetaLength: thetaLength
|
||||
};
|
||||
|
||||
segments = Math.max( 3, segments );
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// helper variables
|
||||
|
||||
const vertex = new Vector3();
|
||||
const uv = new Vector2();
|
||||
|
||||
// center point
|
||||
|
||||
vertices.push( 0, 0, 0 );
|
||||
normals.push( 0, 0, 1 );
|
||||
uvs.push( 0.5, 0.5 );
|
||||
|
||||
for ( let s = 0, i = 3; s <= segments; s ++, i += 3 ) {
|
||||
|
||||
const segment = thetaStart + s / segments * thetaLength;
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = radius * Math.cos( segment );
|
||||
vertex.y = radius * Math.sin( segment );
|
||||
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// normal
|
||||
|
||||
normals.push( 0, 0, 1 );
|
||||
|
||||
// uvs
|
||||
|
||||
uv.x = ( vertices[ i ] / radius + 1 ) / 2;
|
||||
uv.y = ( vertices[ i + 1 ] / radius + 1 ) / 2;
|
||||
|
||||
uvs.push( uv.x, uv.y );
|
||||
|
||||
}
|
||||
|
||||
// indices
|
||||
|
||||
for ( let i = 1; i <= segments; i ++ ) {
|
||||
|
||||
indices.push( i, i + 1, 0 );
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new CircleGeometry( data.radius, data.segments, data.thetaStart, data.thetaLength );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { CircleGeometry };
|
31
site/real_game/node_modules/three/src/geometries/ConeGeometry.js
generated
vendored
Normal file
31
site/real_game/node_modules/three/src/geometries/ConeGeometry.js
generated
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
import { CylinderGeometry } from './CylinderGeometry.js';
|
||||
|
||||
class ConeGeometry extends CylinderGeometry {
|
||||
|
||||
constructor( radius = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {
|
||||
|
||||
super( 0, radius, height, radialSegments, heightSegments, openEnded, thetaStart, thetaLength );
|
||||
|
||||
this.type = 'ConeGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
height: height,
|
||||
radialSegments: radialSegments,
|
||||
heightSegments: heightSegments,
|
||||
openEnded: openEnded,
|
||||
thetaStart: thetaStart,
|
||||
thetaLength: thetaLength
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new ConeGeometry( data.radius, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { ConeGeometry };
|
286
site/real_game/node_modules/three/src/geometries/CylinderGeometry.js
generated
vendored
Normal file
286
site/real_game/node_modules/three/src/geometries/CylinderGeometry.js
generated
vendored
Normal file
@ -0,0 +1,286 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
|
||||
class CylinderGeometry extends BufferGeometry {
|
||||
|
||||
constructor( radiusTop = 1, radiusBottom = 1, height = 1, radialSegments = 32, heightSegments = 1, openEnded = false, thetaStart = 0, thetaLength = Math.PI * 2 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'CylinderGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radiusTop: radiusTop,
|
||||
radiusBottom: radiusBottom,
|
||||
height: height,
|
||||
radialSegments: radialSegments,
|
||||
heightSegments: heightSegments,
|
||||
openEnded: openEnded,
|
||||
thetaStart: thetaStart,
|
||||
thetaLength: thetaLength
|
||||
};
|
||||
|
||||
const scope = this;
|
||||
|
||||
radialSegments = Math.floor( radialSegments );
|
||||
heightSegments = Math.floor( heightSegments );
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// helper variables
|
||||
|
||||
let index = 0;
|
||||
const indexArray = [];
|
||||
const halfHeight = height / 2;
|
||||
let groupStart = 0;
|
||||
|
||||
// generate geometry
|
||||
|
||||
generateTorso();
|
||||
|
||||
if ( openEnded === false ) {
|
||||
|
||||
if ( radiusTop > 0 ) generateCap( true );
|
||||
if ( radiusBottom > 0 ) generateCap( false );
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
function generateTorso() {
|
||||
|
||||
const normal = new Vector3();
|
||||
const vertex = new Vector3();
|
||||
|
||||
let groupCount = 0;
|
||||
|
||||
// this will be used to calculate the normal
|
||||
const slope = ( radiusBottom - radiusTop ) / height;
|
||||
|
||||
// generate vertices, normals and uvs
|
||||
|
||||
for ( let y = 0; y <= heightSegments; y ++ ) {
|
||||
|
||||
const indexRow = [];
|
||||
|
||||
const v = y / heightSegments;
|
||||
|
||||
// calculate the radius of the current row
|
||||
|
||||
const radius = v * ( radiusBottom - radiusTop ) + radiusTop;
|
||||
|
||||
for ( let x = 0; x <= radialSegments; x ++ ) {
|
||||
|
||||
const u = x / radialSegments;
|
||||
|
||||
const theta = u * thetaLength + thetaStart;
|
||||
|
||||
const sinTheta = Math.sin( theta );
|
||||
const cosTheta = Math.cos( theta );
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = radius * sinTheta;
|
||||
vertex.y = - v * height + halfHeight;
|
||||
vertex.z = radius * cosTheta;
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// normal
|
||||
|
||||
normal.set( sinTheta, slope, cosTheta ).normalize();
|
||||
normals.push( normal.x, normal.y, normal.z );
|
||||
|
||||
// uv
|
||||
|
||||
uvs.push( u, 1 - v );
|
||||
|
||||
// save index of vertex in respective row
|
||||
|
||||
indexRow.push( index ++ );
|
||||
|
||||
}
|
||||
|
||||
// now save vertices of the row in our index array
|
||||
|
||||
indexArray.push( indexRow );
|
||||
|
||||
}
|
||||
|
||||
// generate indices
|
||||
|
||||
for ( let x = 0; x < radialSegments; x ++ ) {
|
||||
|
||||
for ( let y = 0; y < heightSegments; y ++ ) {
|
||||
|
||||
// we use the index array to access the correct indices
|
||||
|
||||
const a = indexArray[ y ][ x ];
|
||||
const b = indexArray[ y + 1 ][ x ];
|
||||
const c = indexArray[ y + 1 ][ x + 1 ];
|
||||
const d = indexArray[ y ][ x + 1 ];
|
||||
|
||||
// faces
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( b, c, d );
|
||||
|
||||
// update group counter
|
||||
|
||||
groupCount += 6;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// add a group to the geometry. this will ensure multi material support
|
||||
|
||||
scope.addGroup( groupStart, groupCount, 0 );
|
||||
|
||||
// calculate new start value for groups
|
||||
|
||||
groupStart += groupCount;
|
||||
|
||||
}
|
||||
|
||||
function generateCap( top ) {
|
||||
|
||||
// save the index of the first center vertex
|
||||
const centerIndexStart = index;
|
||||
|
||||
const uv = new Vector2();
|
||||
const vertex = new Vector3();
|
||||
|
||||
let groupCount = 0;
|
||||
|
||||
const radius = ( top === true ) ? radiusTop : radiusBottom;
|
||||
const sign = ( top === true ) ? 1 : - 1;
|
||||
|
||||
// first we generate the center vertex data of the cap.
|
||||
// because the geometry needs one set of uvs per face,
|
||||
// we must generate a center vertex per face/segment
|
||||
|
||||
for ( let x = 1; x <= radialSegments; x ++ ) {
|
||||
|
||||
// vertex
|
||||
|
||||
vertices.push( 0, halfHeight * sign, 0 );
|
||||
|
||||
// normal
|
||||
|
||||
normals.push( 0, sign, 0 );
|
||||
|
||||
// uv
|
||||
|
||||
uvs.push( 0.5, 0.5 );
|
||||
|
||||
// increase index
|
||||
|
||||
index ++;
|
||||
|
||||
}
|
||||
|
||||
// save the index of the last center vertex
|
||||
const centerIndexEnd = index;
|
||||
|
||||
// now we generate the surrounding vertices, normals and uvs
|
||||
|
||||
for ( let x = 0; x <= radialSegments; x ++ ) {
|
||||
|
||||
const u = x / radialSegments;
|
||||
const theta = u * thetaLength + thetaStart;
|
||||
|
||||
const cosTheta = Math.cos( theta );
|
||||
const sinTheta = Math.sin( theta );
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = radius * sinTheta;
|
||||
vertex.y = halfHeight * sign;
|
||||
vertex.z = radius * cosTheta;
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// normal
|
||||
|
||||
normals.push( 0, sign, 0 );
|
||||
|
||||
// uv
|
||||
|
||||
uv.x = ( cosTheta * 0.5 ) + 0.5;
|
||||
uv.y = ( sinTheta * 0.5 * sign ) + 0.5;
|
||||
uvs.push( uv.x, uv.y );
|
||||
|
||||
// increase index
|
||||
|
||||
index ++;
|
||||
|
||||
}
|
||||
|
||||
// generate indices
|
||||
|
||||
for ( let x = 0; x < radialSegments; x ++ ) {
|
||||
|
||||
const c = centerIndexStart + x;
|
||||
const i = centerIndexEnd + x;
|
||||
|
||||
if ( top === true ) {
|
||||
|
||||
// face top
|
||||
|
||||
indices.push( i, i + 1, c );
|
||||
|
||||
} else {
|
||||
|
||||
// face bottom
|
||||
|
||||
indices.push( i + 1, i, c );
|
||||
|
||||
}
|
||||
|
||||
groupCount += 3;
|
||||
|
||||
}
|
||||
|
||||
// add a group to the geometry. this will ensure multi material support
|
||||
|
||||
scope.addGroup( groupStart, groupCount, top === true ? 1 : 2 );
|
||||
|
||||
// calculate new start value for groups
|
||||
|
||||
groupStart += groupCount;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new CylinderGeometry( data.radiusTop, data.radiusBottom, data.height, data.radialSegments, data.heightSegments, data.openEnded, data.thetaStart, data.thetaLength );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { CylinderGeometry };
|
66
site/real_game/node_modules/three/src/geometries/DodecahedronGeometry.js
generated
vendored
Normal file
66
site/real_game/node_modules/three/src/geometries/DodecahedronGeometry.js
generated
vendored
Normal file
@ -0,0 +1,66 @@
|
||||
import { PolyhedronGeometry } from './PolyhedronGeometry.js';
|
||||
|
||||
class DodecahedronGeometry extends PolyhedronGeometry {
|
||||
|
||||
constructor( radius = 1, detail = 0 ) {
|
||||
|
||||
const t = ( 1 + Math.sqrt( 5 ) ) / 2;
|
||||
const r = 1 / t;
|
||||
|
||||
const vertices = [
|
||||
|
||||
// (±1, ±1, ±1)
|
||||
- 1, - 1, - 1, - 1, - 1, 1,
|
||||
- 1, 1, - 1, - 1, 1, 1,
|
||||
1, - 1, - 1, 1, - 1, 1,
|
||||
1, 1, - 1, 1, 1, 1,
|
||||
|
||||
// (0, ±1/φ, ±φ)
|
||||
0, - r, - t, 0, - r, t,
|
||||
0, r, - t, 0, r, t,
|
||||
|
||||
// (±1/φ, ±φ, 0)
|
||||
- r, - t, 0, - r, t, 0,
|
||||
r, - t, 0, r, t, 0,
|
||||
|
||||
// (±φ, 0, ±1/φ)
|
||||
- t, 0, - r, t, 0, - r,
|
||||
- t, 0, r, t, 0, r
|
||||
];
|
||||
|
||||
const indices = [
|
||||
3, 11, 7, 3, 7, 15, 3, 15, 13,
|
||||
7, 19, 17, 7, 17, 6, 7, 6, 15,
|
||||
17, 4, 8, 17, 8, 10, 17, 10, 6,
|
||||
8, 0, 16, 8, 16, 2, 8, 2, 10,
|
||||
0, 12, 1, 0, 1, 18, 0, 18, 16,
|
||||
6, 10, 2, 6, 2, 13, 6, 13, 15,
|
||||
2, 16, 18, 2, 18, 3, 2, 3, 13,
|
||||
18, 1, 9, 18, 9, 11, 18, 11, 3,
|
||||
4, 14, 12, 4, 12, 0, 4, 0, 8,
|
||||
11, 9, 5, 11, 5, 19, 11, 19, 7,
|
||||
19, 5, 14, 19, 14, 4, 19, 4, 17,
|
||||
1, 12, 14, 1, 14, 5, 1, 5, 9
|
||||
];
|
||||
|
||||
super( vertices, indices, radius, detail );
|
||||
|
||||
this.type = 'DodecahedronGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
detail: detail
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new DodecahedronGeometry( data.radius, data.detail );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { DodecahedronGeometry };
|
152
site/real_game/node_modules/three/src/geometries/EdgesGeometry.js
generated
vendored
Normal file
152
site/real_game/node_modules/three/src/geometries/EdgesGeometry.js
generated
vendored
Normal file
@ -0,0 +1,152 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import * as MathUtils from '../math/MathUtils.js';
|
||||
import { Triangle } from '../math/Triangle.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
const _v0 = /*@__PURE__*/ new Vector3();
|
||||
const _v1 = /*@__PURE__*/ new Vector3();
|
||||
const _normal = /*@__PURE__*/ new Vector3();
|
||||
const _triangle = /*@__PURE__*/ new Triangle();
|
||||
|
||||
class EdgesGeometry extends BufferGeometry {
|
||||
|
||||
constructor( geometry = null, thresholdAngle = 1 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'EdgesGeometry';
|
||||
|
||||
this.parameters = {
|
||||
geometry: geometry,
|
||||
thresholdAngle: thresholdAngle
|
||||
};
|
||||
|
||||
if ( geometry !== null ) {
|
||||
|
||||
const precisionPoints = 4;
|
||||
const precision = Math.pow( 10, precisionPoints );
|
||||
const thresholdDot = Math.cos( MathUtils.DEG2RAD * thresholdAngle );
|
||||
|
||||
const indexAttr = geometry.getIndex();
|
||||
const positionAttr = geometry.getAttribute( 'position' );
|
||||
const indexCount = indexAttr ? indexAttr.count : positionAttr.count;
|
||||
|
||||
const indexArr = [ 0, 0, 0 ];
|
||||
const vertKeys = [ 'a', 'b', 'c' ];
|
||||
const hashes = new Array( 3 );
|
||||
|
||||
const edgeData = {};
|
||||
const vertices = [];
|
||||
for ( let i = 0; i < indexCount; i += 3 ) {
|
||||
|
||||
if ( indexAttr ) {
|
||||
|
||||
indexArr[ 0 ] = indexAttr.getX( i );
|
||||
indexArr[ 1 ] = indexAttr.getX( i + 1 );
|
||||
indexArr[ 2 ] = indexAttr.getX( i + 2 );
|
||||
|
||||
} else {
|
||||
|
||||
indexArr[ 0 ] = i;
|
||||
indexArr[ 1 ] = i + 1;
|
||||
indexArr[ 2 ] = i + 2;
|
||||
|
||||
}
|
||||
|
||||
const { a, b, c } = _triangle;
|
||||
a.fromBufferAttribute( positionAttr, indexArr[ 0 ] );
|
||||
b.fromBufferAttribute( positionAttr, indexArr[ 1 ] );
|
||||
c.fromBufferAttribute( positionAttr, indexArr[ 2 ] );
|
||||
_triangle.getNormal( _normal );
|
||||
|
||||
// create hashes for the edge from the vertices
|
||||
hashes[ 0 ] = `${ Math.round( a.x * precision ) },${ Math.round( a.y * precision ) },${ Math.round( a.z * precision ) }`;
|
||||
hashes[ 1 ] = `${ Math.round( b.x * precision ) },${ Math.round( b.y * precision ) },${ Math.round( b.z * precision ) }`;
|
||||
hashes[ 2 ] = `${ Math.round( c.x * precision ) },${ Math.round( c.y * precision ) },${ Math.round( c.z * precision ) }`;
|
||||
|
||||
// skip degenerate triangles
|
||||
if ( hashes[ 0 ] === hashes[ 1 ] || hashes[ 1 ] === hashes[ 2 ] || hashes[ 2 ] === hashes[ 0 ] ) {
|
||||
|
||||
continue;
|
||||
|
||||
}
|
||||
|
||||
// iterate over every edge
|
||||
for ( let j = 0; j < 3; j ++ ) {
|
||||
|
||||
// get the first and next vertex making up the edge
|
||||
const jNext = ( j + 1 ) % 3;
|
||||
const vecHash0 = hashes[ j ];
|
||||
const vecHash1 = hashes[ jNext ];
|
||||
const v0 = _triangle[ vertKeys[ j ] ];
|
||||
const v1 = _triangle[ vertKeys[ jNext ] ];
|
||||
|
||||
const hash = `${ vecHash0 }_${ vecHash1 }`;
|
||||
const reverseHash = `${ vecHash1 }_${ vecHash0 }`;
|
||||
|
||||
if ( reverseHash in edgeData && edgeData[ reverseHash ] ) {
|
||||
|
||||
// if we found a sibling edge add it into the vertex array if
|
||||
// it meets the angle threshold and delete the edge from the map.
|
||||
if ( _normal.dot( edgeData[ reverseHash ].normal ) <= thresholdDot ) {
|
||||
|
||||
vertices.push( v0.x, v0.y, v0.z );
|
||||
vertices.push( v1.x, v1.y, v1.z );
|
||||
|
||||
}
|
||||
|
||||
edgeData[ reverseHash ] = null;
|
||||
|
||||
} else if ( ! ( hash in edgeData ) ) {
|
||||
|
||||
// if we've already got an edge here then skip adding a new one
|
||||
edgeData[ hash ] = {
|
||||
|
||||
index0: indexArr[ j ],
|
||||
index1: indexArr[ jNext ],
|
||||
normal: _normal.clone(),
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// iterate over all remaining, unmatched edges and add them to the vertex array
|
||||
for ( const key in edgeData ) {
|
||||
|
||||
if ( edgeData[ key ] ) {
|
||||
|
||||
const { index0, index1 } = edgeData[ key ];
|
||||
_v0.fromBufferAttribute( positionAttr, index0 );
|
||||
_v1.fromBufferAttribute( positionAttr, index1 );
|
||||
|
||||
vertices.push( _v0.x, _v0.y, _v0.z );
|
||||
vertices.push( _v1.x, _v1.y, _v1.z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { EdgesGeometry };
|
814
site/real_game/node_modules/three/src/geometries/ExtrudeGeometry.js
generated
vendored
Normal file
814
site/real_game/node_modules/three/src/geometries/ExtrudeGeometry.js
generated
vendored
Normal file
@ -0,0 +1,814 @@
|
||||
/**
|
||||
* Creates extruded geometry from a path shape.
|
||||
*
|
||||
* parameters = {
|
||||
*
|
||||
* curveSegments: <int>, // number of points on the curves
|
||||
* steps: <int>, // number of points for z-side extrusions / used for subdividing segments of extrude spline too
|
||||
* depth: <float>, // Depth to extrude the shape
|
||||
*
|
||||
* bevelEnabled: <bool>, // turn on bevel
|
||||
* bevelThickness: <float>, // how deep into the original shape bevel goes
|
||||
* bevelSize: <float>, // how far from shape outline (including bevelOffset) is bevel
|
||||
* bevelOffset: <float>, // how far from shape outline does bevel start
|
||||
* bevelSegments: <int>, // number of bevel layers
|
||||
*
|
||||
* extrudePath: <THREE.Curve> // curve to extrude shape along
|
||||
*
|
||||
* UVGenerator: <Object> // object that provides UV generator functions
|
||||
*
|
||||
* }
|
||||
*/
|
||||
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import * as Curves from '../extras/curves/Curves.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
import { Shape } from '../extras/core/Shape.js';
|
||||
import { ShapeUtils } from '../extras/ShapeUtils.js';
|
||||
|
||||
class ExtrudeGeometry extends BufferGeometry {
|
||||
|
||||
constructor( shapes = new Shape( [ new Vector2( 0.5, 0.5 ), new Vector2( - 0.5, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), options = {} ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'ExtrudeGeometry';
|
||||
|
||||
this.parameters = {
|
||||
shapes: shapes,
|
||||
options: options
|
||||
};
|
||||
|
||||
shapes = Array.isArray( shapes ) ? shapes : [ shapes ];
|
||||
|
||||
const scope = this;
|
||||
|
||||
const verticesArray = [];
|
||||
const uvArray = [];
|
||||
|
||||
for ( let i = 0, l = shapes.length; i < l; i ++ ) {
|
||||
|
||||
const shape = shapes[ i ];
|
||||
addShape( shape );
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( verticesArray, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvArray, 2 ) );
|
||||
|
||||
this.computeVertexNormals();
|
||||
|
||||
// functions
|
||||
|
||||
function addShape( shape ) {
|
||||
|
||||
const placeholder = [];
|
||||
|
||||
// options
|
||||
|
||||
const curveSegments = options.curveSegments !== undefined ? options.curveSegments : 12;
|
||||
const steps = options.steps !== undefined ? options.steps : 1;
|
||||
const depth = options.depth !== undefined ? options.depth : 1;
|
||||
|
||||
let bevelEnabled = options.bevelEnabled !== undefined ? options.bevelEnabled : true;
|
||||
let bevelThickness = options.bevelThickness !== undefined ? options.bevelThickness : 0.2;
|
||||
let bevelSize = options.bevelSize !== undefined ? options.bevelSize : bevelThickness - 0.1;
|
||||
let bevelOffset = options.bevelOffset !== undefined ? options.bevelOffset : 0;
|
||||
let bevelSegments = options.bevelSegments !== undefined ? options.bevelSegments : 3;
|
||||
|
||||
const extrudePath = options.extrudePath;
|
||||
|
||||
const uvgen = options.UVGenerator !== undefined ? options.UVGenerator : WorldUVGenerator;
|
||||
|
||||
//
|
||||
|
||||
let extrudePts, extrudeByPath = false;
|
||||
let splineTube, binormal, normal, position2;
|
||||
|
||||
if ( extrudePath ) {
|
||||
|
||||
extrudePts = extrudePath.getSpacedPoints( steps );
|
||||
|
||||
extrudeByPath = true;
|
||||
bevelEnabled = false; // bevels not supported for path extrusion
|
||||
|
||||
// SETUP TNB variables
|
||||
|
||||
// TODO1 - have a .isClosed in spline?
|
||||
|
||||
splineTube = extrudePath.computeFrenetFrames( steps, false );
|
||||
|
||||
// console.log(splineTube, 'splineTube', splineTube.normals.length, 'steps', steps, 'extrudePts', extrudePts.length);
|
||||
|
||||
binormal = new Vector3();
|
||||
normal = new Vector3();
|
||||
position2 = new Vector3();
|
||||
|
||||
}
|
||||
|
||||
// Safeguards if bevels are not enabled
|
||||
|
||||
if ( ! bevelEnabled ) {
|
||||
|
||||
bevelSegments = 0;
|
||||
bevelThickness = 0;
|
||||
bevelSize = 0;
|
||||
bevelOffset = 0;
|
||||
|
||||
}
|
||||
|
||||
// Variables initialization
|
||||
|
||||
const shapePoints = shape.extractPoints( curveSegments );
|
||||
|
||||
let vertices = shapePoints.shape;
|
||||
const holes = shapePoints.holes;
|
||||
|
||||
const reverse = ! ShapeUtils.isClockWise( vertices );
|
||||
|
||||
if ( reverse ) {
|
||||
|
||||
vertices = vertices.reverse();
|
||||
|
||||
// Maybe we should also check if holes are in the opposite direction, just to be safe ...
|
||||
|
||||
for ( let h = 0, hl = holes.length; h < hl; h ++ ) {
|
||||
|
||||
const ahole = holes[ h ];
|
||||
|
||||
if ( ShapeUtils.isClockWise( ahole ) ) {
|
||||
|
||||
holes[ h ] = ahole.reverse();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
const faces = ShapeUtils.triangulateShape( vertices, holes );
|
||||
|
||||
/* Vertices */
|
||||
|
||||
const contour = vertices; // vertices has all points but contour has only points of circumference
|
||||
|
||||
for ( let h = 0, hl = holes.length; h < hl; h ++ ) {
|
||||
|
||||
const ahole = holes[ h ];
|
||||
|
||||
vertices = vertices.concat( ahole );
|
||||
|
||||
}
|
||||
|
||||
|
||||
function scalePt2( pt, vec, size ) {
|
||||
|
||||
if ( ! vec ) console.error( 'THREE.ExtrudeGeometry: vec does not exist' );
|
||||
|
||||
return pt.clone().addScaledVector( vec, size );
|
||||
|
||||
}
|
||||
|
||||
const vlen = vertices.length, flen = faces.length;
|
||||
|
||||
|
||||
// Find directions for point movement
|
||||
|
||||
|
||||
function getBevelVec( inPt, inPrev, inNext ) {
|
||||
|
||||
// computes for inPt the corresponding point inPt' on a new contour
|
||||
// shifted by 1 unit (length of normalized vector) to the left
|
||||
// if we walk along contour clockwise, this new contour is outside the old one
|
||||
//
|
||||
// inPt' is the intersection of the two lines parallel to the two
|
||||
// adjacent edges of inPt at a distance of 1 unit on the left side.
|
||||
|
||||
let v_trans_x, v_trans_y, shrink_by; // resulting translation vector for inPt
|
||||
|
||||
// good reading for geometry algorithms (here: line-line intersection)
|
||||
// http://geomalgorithms.com/a05-_intersect-1.html
|
||||
|
||||
const v_prev_x = inPt.x - inPrev.x,
|
||||
v_prev_y = inPt.y - inPrev.y;
|
||||
const v_next_x = inNext.x - inPt.x,
|
||||
v_next_y = inNext.y - inPt.y;
|
||||
|
||||
const v_prev_lensq = ( v_prev_x * v_prev_x + v_prev_y * v_prev_y );
|
||||
|
||||
// check for collinear edges
|
||||
const collinear0 = ( v_prev_x * v_next_y - v_prev_y * v_next_x );
|
||||
|
||||
if ( Math.abs( collinear0 ) > Number.EPSILON ) {
|
||||
|
||||
// not collinear
|
||||
|
||||
// length of vectors for normalizing
|
||||
|
||||
const v_prev_len = Math.sqrt( v_prev_lensq );
|
||||
const v_next_len = Math.sqrt( v_next_x * v_next_x + v_next_y * v_next_y );
|
||||
|
||||
// shift adjacent points by unit vectors to the left
|
||||
|
||||
const ptPrevShift_x = ( inPrev.x - v_prev_y / v_prev_len );
|
||||
const ptPrevShift_y = ( inPrev.y + v_prev_x / v_prev_len );
|
||||
|
||||
const ptNextShift_x = ( inNext.x - v_next_y / v_next_len );
|
||||
const ptNextShift_y = ( inNext.y + v_next_x / v_next_len );
|
||||
|
||||
// scaling factor for v_prev to intersection point
|
||||
|
||||
const sf = ( ( ptNextShift_x - ptPrevShift_x ) * v_next_y -
|
||||
( ptNextShift_y - ptPrevShift_y ) * v_next_x ) /
|
||||
( v_prev_x * v_next_y - v_prev_y * v_next_x );
|
||||
|
||||
// vector from inPt to intersection point
|
||||
|
||||
v_trans_x = ( ptPrevShift_x + v_prev_x * sf - inPt.x );
|
||||
v_trans_y = ( ptPrevShift_y + v_prev_y * sf - inPt.y );
|
||||
|
||||
// Don't normalize!, otherwise sharp corners become ugly
|
||||
// but prevent crazy spikes
|
||||
const v_trans_lensq = ( v_trans_x * v_trans_x + v_trans_y * v_trans_y );
|
||||
if ( v_trans_lensq <= 2 ) {
|
||||
|
||||
return new Vector2( v_trans_x, v_trans_y );
|
||||
|
||||
} else {
|
||||
|
||||
shrink_by = Math.sqrt( v_trans_lensq / 2 );
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// handle special case of collinear edges
|
||||
|
||||
let direction_eq = false; // assumes: opposite
|
||||
|
||||
if ( v_prev_x > Number.EPSILON ) {
|
||||
|
||||
if ( v_next_x > Number.EPSILON ) {
|
||||
|
||||
direction_eq = true;
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if ( v_prev_x < - Number.EPSILON ) {
|
||||
|
||||
if ( v_next_x < - Number.EPSILON ) {
|
||||
|
||||
direction_eq = true;
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
if ( Math.sign( v_prev_y ) === Math.sign( v_next_y ) ) {
|
||||
|
||||
direction_eq = true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if ( direction_eq ) {
|
||||
|
||||
// console.log("Warning: lines are a straight sequence");
|
||||
v_trans_x = - v_prev_y;
|
||||
v_trans_y = v_prev_x;
|
||||
shrink_by = Math.sqrt( v_prev_lensq );
|
||||
|
||||
} else {
|
||||
|
||||
// console.log("Warning: lines are a straight spike");
|
||||
v_trans_x = v_prev_x;
|
||||
v_trans_y = v_prev_y;
|
||||
shrink_by = Math.sqrt( v_prev_lensq / 2 );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return new Vector2( v_trans_x / shrink_by, v_trans_y / shrink_by );
|
||||
|
||||
}
|
||||
|
||||
|
||||
const contourMovements = [];
|
||||
|
||||
for ( let i = 0, il = contour.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
|
||||
|
||||
if ( j === il ) j = 0;
|
||||
if ( k === il ) k = 0;
|
||||
|
||||
// (j)---(i)---(k)
|
||||
// console.log('i,j,k', i, j , k)
|
||||
|
||||
contourMovements[ i ] = getBevelVec( contour[ i ], contour[ j ], contour[ k ] );
|
||||
|
||||
}
|
||||
|
||||
const holesMovements = [];
|
||||
let oneHoleMovements, verticesMovements = contourMovements.concat();
|
||||
|
||||
for ( let h = 0, hl = holes.length; h < hl; h ++ ) {
|
||||
|
||||
const ahole = holes[ h ];
|
||||
|
||||
oneHoleMovements = [];
|
||||
|
||||
for ( let i = 0, il = ahole.length, j = il - 1, k = i + 1; i < il; i ++, j ++, k ++ ) {
|
||||
|
||||
if ( j === il ) j = 0;
|
||||
if ( k === il ) k = 0;
|
||||
|
||||
// (j)---(i)---(k)
|
||||
oneHoleMovements[ i ] = getBevelVec( ahole[ i ], ahole[ j ], ahole[ k ] );
|
||||
|
||||
}
|
||||
|
||||
holesMovements.push( oneHoleMovements );
|
||||
verticesMovements = verticesMovements.concat( oneHoleMovements );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Loop bevelSegments, 1 for the front, 1 for the back
|
||||
|
||||
for ( let b = 0; b < bevelSegments; b ++ ) {
|
||||
|
||||
//for ( b = bevelSegments; b > 0; b -- ) {
|
||||
|
||||
const t = b / bevelSegments;
|
||||
const z = bevelThickness * Math.cos( t * Math.PI / 2 );
|
||||
const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;
|
||||
|
||||
// contract shape
|
||||
|
||||
for ( let i = 0, il = contour.length; i < il; i ++ ) {
|
||||
|
||||
const vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
|
||||
|
||||
v( vert.x, vert.y, - z );
|
||||
|
||||
}
|
||||
|
||||
// expand holes
|
||||
|
||||
for ( let h = 0, hl = holes.length; h < hl; h ++ ) {
|
||||
|
||||
const ahole = holes[ h ];
|
||||
oneHoleMovements = holesMovements[ h ];
|
||||
|
||||
for ( let i = 0, il = ahole.length; i < il; i ++ ) {
|
||||
|
||||
const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
|
||||
|
||||
v( vert.x, vert.y, - z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const bs = bevelSize + bevelOffset;
|
||||
|
||||
// Back facing vertices
|
||||
|
||||
for ( let i = 0; i < vlen; i ++ ) {
|
||||
|
||||
const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
|
||||
|
||||
if ( ! extrudeByPath ) {
|
||||
|
||||
v( vert.x, vert.y, 0 );
|
||||
|
||||
} else {
|
||||
|
||||
// v( vert.x, vert.y + extrudePts[ 0 ].y, extrudePts[ 0 ].x );
|
||||
|
||||
normal.copy( splineTube.normals[ 0 ] ).multiplyScalar( vert.x );
|
||||
binormal.copy( splineTube.binormals[ 0 ] ).multiplyScalar( vert.y );
|
||||
|
||||
position2.copy( extrudePts[ 0 ] ).add( normal ).add( binormal );
|
||||
|
||||
v( position2.x, position2.y, position2.z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Add stepped vertices...
|
||||
// Including front facing vertices
|
||||
|
||||
for ( let s = 1; s <= steps; s ++ ) {
|
||||
|
||||
for ( let i = 0; i < vlen; i ++ ) {
|
||||
|
||||
const vert = bevelEnabled ? scalePt2( vertices[ i ], verticesMovements[ i ], bs ) : vertices[ i ];
|
||||
|
||||
if ( ! extrudeByPath ) {
|
||||
|
||||
v( vert.x, vert.y, depth / steps * s );
|
||||
|
||||
} else {
|
||||
|
||||
// v( vert.x, vert.y + extrudePts[ s - 1 ].y, extrudePts[ s - 1 ].x );
|
||||
|
||||
normal.copy( splineTube.normals[ s ] ).multiplyScalar( vert.x );
|
||||
binormal.copy( splineTube.binormals[ s ] ).multiplyScalar( vert.y );
|
||||
|
||||
position2.copy( extrudePts[ s ] ).add( normal ).add( binormal );
|
||||
|
||||
v( position2.x, position2.y, position2.z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Add bevel segments planes
|
||||
|
||||
//for ( b = 1; b <= bevelSegments; b ++ ) {
|
||||
for ( let b = bevelSegments - 1; b >= 0; b -- ) {
|
||||
|
||||
const t = b / bevelSegments;
|
||||
const z = bevelThickness * Math.cos( t * Math.PI / 2 );
|
||||
const bs = bevelSize * Math.sin( t * Math.PI / 2 ) + bevelOffset;
|
||||
|
||||
// contract shape
|
||||
|
||||
for ( let i = 0, il = contour.length; i < il; i ++ ) {
|
||||
|
||||
const vert = scalePt2( contour[ i ], contourMovements[ i ], bs );
|
||||
v( vert.x, vert.y, depth + z );
|
||||
|
||||
}
|
||||
|
||||
// expand holes
|
||||
|
||||
for ( let h = 0, hl = holes.length; h < hl; h ++ ) {
|
||||
|
||||
const ahole = holes[ h ];
|
||||
oneHoleMovements = holesMovements[ h ];
|
||||
|
||||
for ( let i = 0, il = ahole.length; i < il; i ++ ) {
|
||||
|
||||
const vert = scalePt2( ahole[ i ], oneHoleMovements[ i ], bs );
|
||||
|
||||
if ( ! extrudeByPath ) {
|
||||
|
||||
v( vert.x, vert.y, depth + z );
|
||||
|
||||
} else {
|
||||
|
||||
v( vert.x, vert.y + extrudePts[ steps - 1 ].y, extrudePts[ steps - 1 ].x + z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* Faces */
|
||||
|
||||
// Top and bottom faces
|
||||
|
||||
buildLidFaces();
|
||||
|
||||
// Sides faces
|
||||
|
||||
buildSideFaces();
|
||||
|
||||
|
||||
///// Internal functions
|
||||
|
||||
function buildLidFaces() {
|
||||
|
||||
const start = verticesArray.length / 3;
|
||||
|
||||
if ( bevelEnabled ) {
|
||||
|
||||
let layer = 0; // steps + 1
|
||||
let offset = vlen * layer;
|
||||
|
||||
// Bottom faces
|
||||
|
||||
for ( let i = 0; i < flen; i ++ ) {
|
||||
|
||||
const face = faces[ i ];
|
||||
f3( face[ 2 ] + offset, face[ 1 ] + offset, face[ 0 ] + offset );
|
||||
|
||||
}
|
||||
|
||||
layer = steps + bevelSegments * 2;
|
||||
offset = vlen * layer;
|
||||
|
||||
// Top faces
|
||||
|
||||
for ( let i = 0; i < flen; i ++ ) {
|
||||
|
||||
const face = faces[ i ];
|
||||
f3( face[ 0 ] + offset, face[ 1 ] + offset, face[ 2 ] + offset );
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Bottom faces
|
||||
|
||||
for ( let i = 0; i < flen; i ++ ) {
|
||||
|
||||
const face = faces[ i ];
|
||||
f3( face[ 2 ], face[ 1 ], face[ 0 ] );
|
||||
|
||||
}
|
||||
|
||||
// Top faces
|
||||
|
||||
for ( let i = 0; i < flen; i ++ ) {
|
||||
|
||||
const face = faces[ i ];
|
||||
f3( face[ 0 ] + vlen * steps, face[ 1 ] + vlen * steps, face[ 2 ] + vlen * steps );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
scope.addGroup( start, verticesArray.length / 3 - start, 0 );
|
||||
|
||||
}
|
||||
|
||||
// Create faces for the z-sides of the shape
|
||||
|
||||
function buildSideFaces() {
|
||||
|
||||
const start = verticesArray.length / 3;
|
||||
let layeroffset = 0;
|
||||
sidewalls( contour, layeroffset );
|
||||
layeroffset += contour.length;
|
||||
|
||||
for ( let h = 0, hl = holes.length; h < hl; h ++ ) {
|
||||
|
||||
const ahole = holes[ h ];
|
||||
sidewalls( ahole, layeroffset );
|
||||
|
||||
//, true
|
||||
layeroffset += ahole.length;
|
||||
|
||||
}
|
||||
|
||||
|
||||
scope.addGroup( start, verticesArray.length / 3 - start, 1 );
|
||||
|
||||
|
||||
}
|
||||
|
||||
function sidewalls( contour, layeroffset ) {
|
||||
|
||||
let i = contour.length;
|
||||
|
||||
while ( -- i >= 0 ) {
|
||||
|
||||
const j = i;
|
||||
let k = i - 1;
|
||||
if ( k < 0 ) k = contour.length - 1;
|
||||
|
||||
//console.log('b', i,j, i-1, k,vertices.length);
|
||||
|
||||
for ( let s = 0, sl = ( steps + bevelSegments * 2 ); s < sl; s ++ ) {
|
||||
|
||||
const slen1 = vlen * s;
|
||||
const slen2 = vlen * ( s + 1 );
|
||||
|
||||
const a = layeroffset + j + slen1,
|
||||
b = layeroffset + k + slen1,
|
||||
c = layeroffset + k + slen2,
|
||||
d = layeroffset + j + slen2;
|
||||
|
||||
f4( a, b, c, d );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function v( x, y, z ) {
|
||||
|
||||
placeholder.push( x );
|
||||
placeholder.push( y );
|
||||
placeholder.push( z );
|
||||
|
||||
}
|
||||
|
||||
|
||||
function f3( a, b, c ) {
|
||||
|
||||
addVertex( a );
|
||||
addVertex( b );
|
||||
addVertex( c );
|
||||
|
||||
const nextIndex = verticesArray.length / 3;
|
||||
const uvs = uvgen.generateTopUV( scope, verticesArray, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
|
||||
|
||||
addUV( uvs[ 0 ] );
|
||||
addUV( uvs[ 1 ] );
|
||||
addUV( uvs[ 2 ] );
|
||||
|
||||
}
|
||||
|
||||
function f4( a, b, c, d ) {
|
||||
|
||||
addVertex( a );
|
||||
addVertex( b );
|
||||
addVertex( d );
|
||||
|
||||
addVertex( b );
|
||||
addVertex( c );
|
||||
addVertex( d );
|
||||
|
||||
|
||||
const nextIndex = verticesArray.length / 3;
|
||||
const uvs = uvgen.generateSideWallUV( scope, verticesArray, nextIndex - 6, nextIndex - 3, nextIndex - 2, nextIndex - 1 );
|
||||
|
||||
addUV( uvs[ 0 ] );
|
||||
addUV( uvs[ 1 ] );
|
||||
addUV( uvs[ 3 ] );
|
||||
|
||||
addUV( uvs[ 1 ] );
|
||||
addUV( uvs[ 2 ] );
|
||||
addUV( uvs[ 3 ] );
|
||||
|
||||
}
|
||||
|
||||
function addVertex( index ) {
|
||||
|
||||
verticesArray.push( placeholder[ index * 3 + 0 ] );
|
||||
verticesArray.push( placeholder[ index * 3 + 1 ] );
|
||||
verticesArray.push( placeholder[ index * 3 + 2 ] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
function addUV( vector2 ) {
|
||||
|
||||
uvArray.push( vector2.x );
|
||||
uvArray.push( vector2.y );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
toJSON() {
|
||||
|
||||
const data = super.toJSON();
|
||||
|
||||
const shapes = this.parameters.shapes;
|
||||
const options = this.parameters.options;
|
||||
|
||||
return toJSON( shapes, options, data );
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data, shapes ) {
|
||||
|
||||
const geometryShapes = [];
|
||||
|
||||
for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {
|
||||
|
||||
const shape = shapes[ data.shapes[ j ] ];
|
||||
|
||||
geometryShapes.push( shape );
|
||||
|
||||
}
|
||||
|
||||
const extrudePath = data.options.extrudePath;
|
||||
|
||||
if ( extrudePath !== undefined ) {
|
||||
|
||||
data.options.extrudePath = new Curves[ extrudePath.type ]().fromJSON( extrudePath );
|
||||
|
||||
}
|
||||
|
||||
return new ExtrudeGeometry( geometryShapes, data.options );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const WorldUVGenerator = {
|
||||
|
||||
generateTopUV: function ( geometry, vertices, indexA, indexB, indexC ) {
|
||||
|
||||
const a_x = vertices[ indexA * 3 ];
|
||||
const a_y = vertices[ indexA * 3 + 1 ];
|
||||
const b_x = vertices[ indexB * 3 ];
|
||||
const b_y = vertices[ indexB * 3 + 1 ];
|
||||
const c_x = vertices[ indexC * 3 ];
|
||||
const c_y = vertices[ indexC * 3 + 1 ];
|
||||
|
||||
return [
|
||||
new Vector2( a_x, a_y ),
|
||||
new Vector2( b_x, b_y ),
|
||||
new Vector2( c_x, c_y )
|
||||
];
|
||||
|
||||
},
|
||||
|
||||
generateSideWallUV: function ( geometry, vertices, indexA, indexB, indexC, indexD ) {
|
||||
|
||||
const a_x = vertices[ indexA * 3 ];
|
||||
const a_y = vertices[ indexA * 3 + 1 ];
|
||||
const a_z = vertices[ indexA * 3 + 2 ];
|
||||
const b_x = vertices[ indexB * 3 ];
|
||||
const b_y = vertices[ indexB * 3 + 1 ];
|
||||
const b_z = vertices[ indexB * 3 + 2 ];
|
||||
const c_x = vertices[ indexC * 3 ];
|
||||
const c_y = vertices[ indexC * 3 + 1 ];
|
||||
const c_z = vertices[ indexC * 3 + 2 ];
|
||||
const d_x = vertices[ indexD * 3 ];
|
||||
const d_y = vertices[ indexD * 3 + 1 ];
|
||||
const d_z = vertices[ indexD * 3 + 2 ];
|
||||
|
||||
if ( Math.abs( a_y - b_y ) < Math.abs( a_x - b_x ) ) {
|
||||
|
||||
return [
|
||||
new Vector2( a_x, 1 - a_z ),
|
||||
new Vector2( b_x, 1 - b_z ),
|
||||
new Vector2( c_x, 1 - c_z ),
|
||||
new Vector2( d_x, 1 - d_z )
|
||||
];
|
||||
|
||||
} else {
|
||||
|
||||
return [
|
||||
new Vector2( a_y, 1 - a_z ),
|
||||
new Vector2( b_y, 1 - b_z ),
|
||||
new Vector2( c_y, 1 - c_z ),
|
||||
new Vector2( d_y, 1 - d_z )
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
function toJSON( shapes, options, data ) {
|
||||
|
||||
data.shapes = [];
|
||||
|
||||
if ( Array.isArray( shapes ) ) {
|
||||
|
||||
for ( let i = 0, l = shapes.length; i < l; i ++ ) {
|
||||
|
||||
const shape = shapes[ i ];
|
||||
|
||||
data.shapes.push( shape.uuid );
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
data.shapes.push( shapes.uuid );
|
||||
|
||||
}
|
||||
|
||||
data.options = Object.assign( {}, options );
|
||||
|
||||
if ( options.extrudePath !== undefined ) data.options.extrudePath = options.extrudePath.toJSON();
|
||||
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { ExtrudeGeometry };
|
21
site/real_game/node_modules/three/src/geometries/Geometries.js
generated
vendored
Normal file
21
site/real_game/node_modules/three/src/geometries/Geometries.js
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
export * from './BoxGeometry.js';
|
||||
export * from './CapsuleGeometry.js';
|
||||
export * from './CircleGeometry.js';
|
||||
export * from './ConeGeometry.js';
|
||||
export * from './CylinderGeometry.js';
|
||||
export * from './DodecahedronGeometry.js';
|
||||
export * from './EdgesGeometry.js';
|
||||
export * from './ExtrudeGeometry.js';
|
||||
export * from './IcosahedronGeometry.js';
|
||||
export * from './LatheGeometry.js';
|
||||
export * from './OctahedronGeometry.js';
|
||||
export * from './PlaneGeometry.js';
|
||||
export * from './PolyhedronGeometry.js';
|
||||
export * from './RingGeometry.js';
|
||||
export * from './ShapeGeometry.js';
|
||||
export * from './SphereGeometry.js';
|
||||
export * from './TetrahedronGeometry.js';
|
||||
export * from './TorusGeometry.js';
|
||||
export * from './TorusKnotGeometry.js';
|
||||
export * from './TubeGeometry.js';
|
||||
export * from './WireframeGeometry.js';
|
42
site/real_game/node_modules/three/src/geometries/IcosahedronGeometry.js
generated
vendored
Normal file
42
site/real_game/node_modules/three/src/geometries/IcosahedronGeometry.js
generated
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
import { PolyhedronGeometry } from './PolyhedronGeometry.js';
|
||||
|
||||
class IcosahedronGeometry extends PolyhedronGeometry {
|
||||
|
||||
constructor( radius = 1, detail = 0 ) {
|
||||
|
||||
const t = ( 1 + Math.sqrt( 5 ) ) / 2;
|
||||
|
||||
const vertices = [
|
||||
- 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t, 0,
|
||||
0, - 1, t, 0, 1, t, 0, - 1, - t, 0, 1, - t,
|
||||
t, 0, - 1, t, 0, 1, - t, 0, - 1, - t, 0, 1
|
||||
];
|
||||
|
||||
const indices = [
|
||||
0, 11, 5, 0, 5, 1, 0, 1, 7, 0, 7, 10, 0, 10, 11,
|
||||
1, 5, 9, 5, 11, 4, 11, 10, 2, 10, 7, 6, 7, 1, 8,
|
||||
3, 9, 4, 3, 4, 2, 3, 2, 6, 3, 6, 8, 3, 8, 9,
|
||||
4, 9, 5, 2, 4, 11, 6, 2, 10, 8, 6, 7, 9, 8, 1
|
||||
];
|
||||
|
||||
super( vertices, indices, radius, detail );
|
||||
|
||||
this.type = 'IcosahedronGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
detail: detail
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new IcosahedronGeometry( data.radius, data.detail );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { IcosahedronGeometry };
|
189
site/real_game/node_modules/three/src/geometries/LatheGeometry.js
generated
vendored
Normal file
189
site/real_game/node_modules/three/src/geometries/LatheGeometry.js
generated
vendored
Normal file
@ -0,0 +1,189 @@
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
import * as MathUtils from '../math/MathUtils.js';
|
||||
|
||||
class LatheGeometry extends BufferGeometry {
|
||||
|
||||
constructor( points = [ new Vector2( 0, - 0.5 ), new Vector2( 0.5, 0 ), new Vector2( 0, 0.5 ) ], segments = 12, phiStart = 0, phiLength = Math.PI * 2 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'LatheGeometry';
|
||||
|
||||
this.parameters = {
|
||||
points: points,
|
||||
segments: segments,
|
||||
phiStart: phiStart,
|
||||
phiLength: phiLength
|
||||
};
|
||||
|
||||
segments = Math.floor( segments );
|
||||
|
||||
// clamp phiLength so it's in range of [ 0, 2PI ]
|
||||
|
||||
phiLength = MathUtils.clamp( phiLength, 0, Math.PI * 2 );
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const uvs = [];
|
||||
const initNormals = [];
|
||||
const normals = [];
|
||||
|
||||
// helper variables
|
||||
|
||||
const inverseSegments = 1.0 / segments;
|
||||
const vertex = new Vector3();
|
||||
const uv = new Vector2();
|
||||
const normal = new Vector3();
|
||||
const curNormal = new Vector3();
|
||||
const prevNormal = new Vector3();
|
||||
let dx = 0;
|
||||
let dy = 0;
|
||||
|
||||
// pre-compute normals for initial "meridian"
|
||||
|
||||
for ( let j = 0; j <= ( points.length - 1 ); j ++ ) {
|
||||
|
||||
switch ( j ) {
|
||||
|
||||
case 0: // special handling for 1st vertex on path
|
||||
|
||||
dx = points[ j + 1 ].x - points[ j ].x;
|
||||
dy = points[ j + 1 ].y - points[ j ].y;
|
||||
|
||||
normal.x = dy * 1.0;
|
||||
normal.y = - dx;
|
||||
normal.z = dy * 0.0;
|
||||
|
||||
prevNormal.copy( normal );
|
||||
|
||||
normal.normalize();
|
||||
|
||||
initNormals.push( normal.x, normal.y, normal.z );
|
||||
|
||||
break;
|
||||
|
||||
case ( points.length - 1 ): // special handling for last Vertex on path
|
||||
|
||||
initNormals.push( prevNormal.x, prevNormal.y, prevNormal.z );
|
||||
|
||||
break;
|
||||
|
||||
default: // default handling for all vertices in between
|
||||
|
||||
dx = points[ j + 1 ].x - points[ j ].x;
|
||||
dy = points[ j + 1 ].y - points[ j ].y;
|
||||
|
||||
normal.x = dy * 1.0;
|
||||
normal.y = - dx;
|
||||
normal.z = dy * 0.0;
|
||||
|
||||
curNormal.copy( normal );
|
||||
|
||||
normal.x += prevNormal.x;
|
||||
normal.y += prevNormal.y;
|
||||
normal.z += prevNormal.z;
|
||||
|
||||
normal.normalize();
|
||||
|
||||
initNormals.push( normal.x, normal.y, normal.z );
|
||||
|
||||
prevNormal.copy( curNormal );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// generate vertices, uvs and normals
|
||||
|
||||
for ( let i = 0; i <= segments; i ++ ) {
|
||||
|
||||
const phi = phiStart + i * inverseSegments * phiLength;
|
||||
|
||||
const sin = Math.sin( phi );
|
||||
const cos = Math.cos( phi );
|
||||
|
||||
for ( let j = 0; j <= ( points.length - 1 ); j ++ ) {
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = points[ j ].x * sin;
|
||||
vertex.y = points[ j ].y;
|
||||
vertex.z = points[ j ].x * cos;
|
||||
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// uv
|
||||
|
||||
uv.x = i / segments;
|
||||
uv.y = j / ( points.length - 1 );
|
||||
|
||||
uvs.push( uv.x, uv.y );
|
||||
|
||||
// normal
|
||||
|
||||
const x = initNormals[ 3 * j + 0 ] * sin;
|
||||
const y = initNormals[ 3 * j + 1 ];
|
||||
const z = initNormals[ 3 * j + 0 ] * cos;
|
||||
|
||||
normals.push( x, y, z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// indices
|
||||
|
||||
for ( let i = 0; i < segments; i ++ ) {
|
||||
|
||||
for ( let j = 0; j < ( points.length - 1 ); j ++ ) {
|
||||
|
||||
const base = j + i * points.length;
|
||||
|
||||
const a = base;
|
||||
const b = base + points.length;
|
||||
const c = base + points.length + 1;
|
||||
const d = base + 1;
|
||||
|
||||
// faces
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( c, d, b );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new LatheGeometry( data.points, data.segments, data.phiStart, data.phiLength );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { LatheGeometry };
|
37
site/real_game/node_modules/three/src/geometries/OctahedronGeometry.js
generated
vendored
Normal file
37
site/real_game/node_modules/three/src/geometries/OctahedronGeometry.js
generated
vendored
Normal file
@ -0,0 +1,37 @@
|
||||
import { PolyhedronGeometry } from './PolyhedronGeometry.js';
|
||||
|
||||
class OctahedronGeometry extends PolyhedronGeometry {
|
||||
|
||||
constructor( radius = 1, detail = 0 ) {
|
||||
|
||||
const vertices = [
|
||||
1, 0, 0, - 1, 0, 0, 0, 1, 0,
|
||||
0, - 1, 0, 0, 0, 1, 0, 0, - 1
|
||||
];
|
||||
|
||||
const indices = [
|
||||
0, 2, 4, 0, 4, 3, 0, 3, 5,
|
||||
0, 5, 2, 1, 2, 5, 1, 5, 3,
|
||||
1, 3, 4, 1, 4, 2
|
||||
];
|
||||
|
||||
super( vertices, indices, radius, detail );
|
||||
|
||||
this.type = 'OctahedronGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
detail: detail
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new OctahedronGeometry( data.radius, data.detail );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { OctahedronGeometry };
|
98
site/real_game/node_modules/three/src/geometries/PlaneGeometry.js
generated
vendored
Normal file
98
site/real_game/node_modules/three/src/geometries/PlaneGeometry.js
generated
vendored
Normal file
@ -0,0 +1,98 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
|
||||
class PlaneGeometry extends BufferGeometry {
|
||||
|
||||
constructor( width = 1, height = 1, widthSegments = 1, heightSegments = 1 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'PlaneGeometry';
|
||||
|
||||
this.parameters = {
|
||||
width: width,
|
||||
height: height,
|
||||
widthSegments: widthSegments,
|
||||
heightSegments: heightSegments
|
||||
};
|
||||
|
||||
const width_half = width / 2;
|
||||
const height_half = height / 2;
|
||||
|
||||
const gridX = Math.floor( widthSegments );
|
||||
const gridY = Math.floor( heightSegments );
|
||||
|
||||
const gridX1 = gridX + 1;
|
||||
const gridY1 = gridY + 1;
|
||||
|
||||
const segment_width = width / gridX;
|
||||
const segment_height = height / gridY;
|
||||
|
||||
//
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
for ( let iy = 0; iy < gridY1; iy ++ ) {
|
||||
|
||||
const y = iy * segment_height - height_half;
|
||||
|
||||
for ( let ix = 0; ix < gridX1; ix ++ ) {
|
||||
|
||||
const x = ix * segment_width - width_half;
|
||||
|
||||
vertices.push( x, - y, 0 );
|
||||
|
||||
normals.push( 0, 0, 1 );
|
||||
|
||||
uvs.push( ix / gridX );
|
||||
uvs.push( 1 - ( iy / gridY ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for ( let iy = 0; iy < gridY; iy ++ ) {
|
||||
|
||||
for ( let ix = 0; ix < gridX; ix ++ ) {
|
||||
|
||||
const a = ix + gridX1 * iy;
|
||||
const b = ix + gridX1 * ( iy + 1 );
|
||||
const c = ( ix + 1 ) + gridX1 * ( iy + 1 );
|
||||
const d = ( ix + 1 ) + gridX1 * iy;
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( b, c, d );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new PlaneGeometry( data.width, data.height, data.widthSegments, data.heightSegments );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { PlaneGeometry };
|
319
site/real_game/node_modules/three/src/geometries/PolyhedronGeometry.js
generated
vendored
Normal file
319
site/real_game/node_modules/three/src/geometries/PolyhedronGeometry.js
generated
vendored
Normal file
@ -0,0 +1,319 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
|
||||
class PolyhedronGeometry extends BufferGeometry {
|
||||
|
||||
constructor( vertices = [], indices = [], radius = 1, detail = 0 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'PolyhedronGeometry';
|
||||
|
||||
this.parameters = {
|
||||
vertices: vertices,
|
||||
indices: indices,
|
||||
radius: radius,
|
||||
detail: detail
|
||||
};
|
||||
|
||||
// default buffer data
|
||||
|
||||
const vertexBuffer = [];
|
||||
const uvBuffer = [];
|
||||
|
||||
// the subdivision creates the vertex buffer data
|
||||
|
||||
subdivide( detail );
|
||||
|
||||
// all vertices should lie on a conceptual sphere with a given radius
|
||||
|
||||
applyRadius( radius );
|
||||
|
||||
// finally, create the uv data
|
||||
|
||||
generateUVs();
|
||||
|
||||
// build non-indexed geometry
|
||||
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertexBuffer, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( vertexBuffer.slice(), 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvBuffer, 2 ) );
|
||||
|
||||
if ( detail === 0 ) {
|
||||
|
||||
this.computeVertexNormals(); // flat normals
|
||||
|
||||
} else {
|
||||
|
||||
this.normalizeNormals(); // smooth normals
|
||||
|
||||
}
|
||||
|
||||
// helper functions
|
||||
|
||||
function subdivide( detail ) {
|
||||
|
||||
const a = new Vector3();
|
||||
const b = new Vector3();
|
||||
const c = new Vector3();
|
||||
|
||||
// iterate over all faces and apply a subdivision with the given detail value
|
||||
|
||||
for ( let i = 0; i < indices.length; i += 3 ) {
|
||||
|
||||
// get the vertices of the face
|
||||
|
||||
getVertexByIndex( indices[ i + 0 ], a );
|
||||
getVertexByIndex( indices[ i + 1 ], b );
|
||||
getVertexByIndex( indices[ i + 2 ], c );
|
||||
|
||||
// perform subdivision
|
||||
|
||||
subdivideFace( a, b, c, detail );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function subdivideFace( a, b, c, detail ) {
|
||||
|
||||
const cols = detail + 1;
|
||||
|
||||
// we use this multidimensional array as a data structure for creating the subdivision
|
||||
|
||||
const v = [];
|
||||
|
||||
// construct all of the vertices for this subdivision
|
||||
|
||||
for ( let i = 0; i <= cols; i ++ ) {
|
||||
|
||||
v[ i ] = [];
|
||||
|
||||
const aj = a.clone().lerp( c, i / cols );
|
||||
const bj = b.clone().lerp( c, i / cols );
|
||||
|
||||
const rows = cols - i;
|
||||
|
||||
for ( let j = 0; j <= rows; j ++ ) {
|
||||
|
||||
if ( j === 0 && i === cols ) {
|
||||
|
||||
v[ i ][ j ] = aj;
|
||||
|
||||
} else {
|
||||
|
||||
v[ i ][ j ] = aj.clone().lerp( bj, j / rows );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// construct all of the faces
|
||||
|
||||
for ( let i = 0; i < cols; i ++ ) {
|
||||
|
||||
for ( let j = 0; j < 2 * ( cols - i ) - 1; j ++ ) {
|
||||
|
||||
const k = Math.floor( j / 2 );
|
||||
|
||||
if ( j % 2 === 0 ) {
|
||||
|
||||
pushVertex( v[ i ][ k + 1 ] );
|
||||
pushVertex( v[ i + 1 ][ k ] );
|
||||
pushVertex( v[ i ][ k ] );
|
||||
|
||||
} else {
|
||||
|
||||
pushVertex( v[ i ][ k + 1 ] );
|
||||
pushVertex( v[ i + 1 ][ k + 1 ] );
|
||||
pushVertex( v[ i + 1 ][ k ] );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function applyRadius( radius ) {
|
||||
|
||||
const vertex = new Vector3();
|
||||
|
||||
// iterate over the entire buffer and apply the radius to each vertex
|
||||
|
||||
for ( let i = 0; i < vertexBuffer.length; i += 3 ) {
|
||||
|
||||
vertex.x = vertexBuffer[ i + 0 ];
|
||||
vertex.y = vertexBuffer[ i + 1 ];
|
||||
vertex.z = vertexBuffer[ i + 2 ];
|
||||
|
||||
vertex.normalize().multiplyScalar( radius );
|
||||
|
||||
vertexBuffer[ i + 0 ] = vertex.x;
|
||||
vertexBuffer[ i + 1 ] = vertex.y;
|
||||
vertexBuffer[ i + 2 ] = vertex.z;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function generateUVs() {
|
||||
|
||||
const vertex = new Vector3();
|
||||
|
||||
for ( let i = 0; i < vertexBuffer.length; i += 3 ) {
|
||||
|
||||
vertex.x = vertexBuffer[ i + 0 ];
|
||||
vertex.y = vertexBuffer[ i + 1 ];
|
||||
vertex.z = vertexBuffer[ i + 2 ];
|
||||
|
||||
const u = azimuth( vertex ) / 2 / Math.PI + 0.5;
|
||||
const v = inclination( vertex ) / Math.PI + 0.5;
|
||||
uvBuffer.push( u, 1 - v );
|
||||
|
||||
}
|
||||
|
||||
correctUVs();
|
||||
|
||||
correctSeam();
|
||||
|
||||
}
|
||||
|
||||
function correctSeam() {
|
||||
|
||||
// handle case when face straddles the seam, see #3269
|
||||
|
||||
for ( let i = 0; i < uvBuffer.length; i += 6 ) {
|
||||
|
||||
// uv data of a single face
|
||||
|
||||
const x0 = uvBuffer[ i + 0 ];
|
||||
const x1 = uvBuffer[ i + 2 ];
|
||||
const x2 = uvBuffer[ i + 4 ];
|
||||
|
||||
const max = Math.max( x0, x1, x2 );
|
||||
const min = Math.min( x0, x1, x2 );
|
||||
|
||||
// 0.9 is somewhat arbitrary
|
||||
|
||||
if ( max > 0.9 && min < 0.1 ) {
|
||||
|
||||
if ( x0 < 0.2 ) uvBuffer[ i + 0 ] += 1;
|
||||
if ( x1 < 0.2 ) uvBuffer[ i + 2 ] += 1;
|
||||
if ( x2 < 0.2 ) uvBuffer[ i + 4 ] += 1;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function pushVertex( vertex ) {
|
||||
|
||||
vertexBuffer.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
}
|
||||
|
||||
function getVertexByIndex( index, vertex ) {
|
||||
|
||||
const stride = index * 3;
|
||||
|
||||
vertex.x = vertices[ stride + 0 ];
|
||||
vertex.y = vertices[ stride + 1 ];
|
||||
vertex.z = vertices[ stride + 2 ];
|
||||
|
||||
}
|
||||
|
||||
function correctUVs() {
|
||||
|
||||
const a = new Vector3();
|
||||
const b = new Vector3();
|
||||
const c = new Vector3();
|
||||
|
||||
const centroid = new Vector3();
|
||||
|
||||
const uvA = new Vector2();
|
||||
const uvB = new Vector2();
|
||||
const uvC = new Vector2();
|
||||
|
||||
for ( let i = 0, j = 0; i < vertexBuffer.length; i += 9, j += 6 ) {
|
||||
|
||||
a.set( vertexBuffer[ i + 0 ], vertexBuffer[ i + 1 ], vertexBuffer[ i + 2 ] );
|
||||
b.set( vertexBuffer[ i + 3 ], vertexBuffer[ i + 4 ], vertexBuffer[ i + 5 ] );
|
||||
c.set( vertexBuffer[ i + 6 ], vertexBuffer[ i + 7 ], vertexBuffer[ i + 8 ] );
|
||||
|
||||
uvA.set( uvBuffer[ j + 0 ], uvBuffer[ j + 1 ] );
|
||||
uvB.set( uvBuffer[ j + 2 ], uvBuffer[ j + 3 ] );
|
||||
uvC.set( uvBuffer[ j + 4 ], uvBuffer[ j + 5 ] );
|
||||
|
||||
centroid.copy( a ).add( b ).add( c ).divideScalar( 3 );
|
||||
|
||||
const azi = azimuth( centroid );
|
||||
|
||||
correctUV( uvA, j + 0, a, azi );
|
||||
correctUV( uvB, j + 2, b, azi );
|
||||
correctUV( uvC, j + 4, c, azi );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function correctUV( uv, stride, vector, azimuth ) {
|
||||
|
||||
if ( ( azimuth < 0 ) && ( uv.x === 1 ) ) {
|
||||
|
||||
uvBuffer[ stride ] = uv.x - 1;
|
||||
|
||||
}
|
||||
|
||||
if ( ( vector.x === 0 ) && ( vector.z === 0 ) ) {
|
||||
|
||||
uvBuffer[ stride ] = azimuth / 2 / Math.PI + 0.5;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Angle around the Y axis, counter-clockwise when looking from above.
|
||||
|
||||
function azimuth( vector ) {
|
||||
|
||||
return Math.atan2( vector.z, - vector.x );
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Angle above the XZ plane.
|
||||
|
||||
function inclination( vector ) {
|
||||
|
||||
return Math.atan2( - vector.y, Math.sqrt( ( vector.x * vector.x ) + ( vector.z * vector.z ) ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new PolyhedronGeometry( data.vertices, data.indices, data.radius, data.details );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { PolyhedronGeometry };
|
128
site/real_game/node_modules/three/src/geometries/RingGeometry.js
generated
vendored
Normal file
128
site/real_game/node_modules/three/src/geometries/RingGeometry.js
generated
vendored
Normal file
@ -0,0 +1,128 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
class RingGeometry extends BufferGeometry {
|
||||
|
||||
constructor( innerRadius = 0.5, outerRadius = 1, thetaSegments = 32, phiSegments = 1, thetaStart = 0, thetaLength = Math.PI * 2 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'RingGeometry';
|
||||
|
||||
this.parameters = {
|
||||
innerRadius: innerRadius,
|
||||
outerRadius: outerRadius,
|
||||
thetaSegments: thetaSegments,
|
||||
phiSegments: phiSegments,
|
||||
thetaStart: thetaStart,
|
||||
thetaLength: thetaLength
|
||||
};
|
||||
|
||||
thetaSegments = Math.max( 3, thetaSegments );
|
||||
phiSegments = Math.max( 1, phiSegments );
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// some helper variables
|
||||
|
||||
let radius = innerRadius;
|
||||
const radiusStep = ( ( outerRadius - innerRadius ) / phiSegments );
|
||||
const vertex = new Vector3();
|
||||
const uv = new Vector2();
|
||||
|
||||
// generate vertices, normals and uvs
|
||||
|
||||
for ( let j = 0; j <= phiSegments; j ++ ) {
|
||||
|
||||
for ( let i = 0; i <= thetaSegments; i ++ ) {
|
||||
|
||||
// values are generate from the inside of the ring to the outside
|
||||
|
||||
const segment = thetaStart + i / thetaSegments * thetaLength;
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = radius * Math.cos( segment );
|
||||
vertex.y = radius * Math.sin( segment );
|
||||
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// normal
|
||||
|
||||
normals.push( 0, 0, 1 );
|
||||
|
||||
// uv
|
||||
|
||||
uv.x = ( vertex.x / outerRadius + 1 ) / 2;
|
||||
uv.y = ( vertex.y / outerRadius + 1 ) / 2;
|
||||
|
||||
uvs.push( uv.x, uv.y );
|
||||
|
||||
}
|
||||
|
||||
// increase the radius for next row of vertices
|
||||
|
||||
radius += radiusStep;
|
||||
|
||||
}
|
||||
|
||||
// indices
|
||||
|
||||
for ( let j = 0; j < phiSegments; j ++ ) {
|
||||
|
||||
const thetaSegmentLevel = j * ( thetaSegments + 1 );
|
||||
|
||||
for ( let i = 0; i < thetaSegments; i ++ ) {
|
||||
|
||||
const segment = i + thetaSegmentLevel;
|
||||
|
||||
const a = segment;
|
||||
const b = segment + thetaSegments + 1;
|
||||
const c = segment + thetaSegments + 2;
|
||||
const d = segment + 1;
|
||||
|
||||
// faces
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( b, c, d );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { RingGeometry };
|
195
site/real_game/node_modules/three/src/geometries/ShapeGeometry.js
generated
vendored
Normal file
195
site/real_game/node_modules/three/src/geometries/ShapeGeometry.js
generated
vendored
Normal file
@ -0,0 +1,195 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Shape } from '../extras/core/Shape.js';
|
||||
import { ShapeUtils } from '../extras/ShapeUtils.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
|
||||
class ShapeGeometry extends BufferGeometry {
|
||||
|
||||
constructor( shapes = new Shape( [ new Vector2( 0, 0.5 ), new Vector2( - 0.5, - 0.5 ), new Vector2( 0.5, - 0.5 ) ] ), curveSegments = 12 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'ShapeGeometry';
|
||||
|
||||
this.parameters = {
|
||||
shapes: shapes,
|
||||
curveSegments: curveSegments
|
||||
};
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// helper variables
|
||||
|
||||
let groupStart = 0;
|
||||
let groupCount = 0;
|
||||
|
||||
// allow single and array values for "shapes" parameter
|
||||
|
||||
if ( Array.isArray( shapes ) === false ) {
|
||||
|
||||
addShape( shapes );
|
||||
|
||||
} else {
|
||||
|
||||
for ( let i = 0; i < shapes.length; i ++ ) {
|
||||
|
||||
addShape( shapes[ i ] );
|
||||
|
||||
this.addGroup( groupStart, groupCount, i ); // enables MultiMaterial support
|
||||
|
||||
groupStart += groupCount;
|
||||
groupCount = 0;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
|
||||
// helper functions
|
||||
|
||||
function addShape( shape ) {
|
||||
|
||||
const indexOffset = vertices.length / 3;
|
||||
const points = shape.extractPoints( curveSegments );
|
||||
|
||||
let shapeVertices = points.shape;
|
||||
const shapeHoles = points.holes;
|
||||
|
||||
// check direction of vertices
|
||||
|
||||
if ( ShapeUtils.isClockWise( shapeVertices ) === false ) {
|
||||
|
||||
shapeVertices = shapeVertices.reverse();
|
||||
|
||||
}
|
||||
|
||||
for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {
|
||||
|
||||
const shapeHole = shapeHoles[ i ];
|
||||
|
||||
if ( ShapeUtils.isClockWise( shapeHole ) === true ) {
|
||||
|
||||
shapeHoles[ i ] = shapeHole.reverse();
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const faces = ShapeUtils.triangulateShape( shapeVertices, shapeHoles );
|
||||
|
||||
// join vertices of inner and outer paths to a single array
|
||||
|
||||
for ( let i = 0, l = shapeHoles.length; i < l; i ++ ) {
|
||||
|
||||
const shapeHole = shapeHoles[ i ];
|
||||
shapeVertices = shapeVertices.concat( shapeHole );
|
||||
|
||||
}
|
||||
|
||||
// vertices, normals, uvs
|
||||
|
||||
for ( let i = 0, l = shapeVertices.length; i < l; i ++ ) {
|
||||
|
||||
const vertex = shapeVertices[ i ];
|
||||
|
||||
vertices.push( vertex.x, vertex.y, 0 );
|
||||
normals.push( 0, 0, 1 );
|
||||
uvs.push( vertex.x, vertex.y ); // world uvs
|
||||
|
||||
}
|
||||
|
||||
// indices
|
||||
|
||||
for ( let i = 0, l = faces.length; i < l; i ++ ) {
|
||||
|
||||
const face = faces[ i ];
|
||||
|
||||
const a = face[ 0 ] + indexOffset;
|
||||
const b = face[ 1 ] + indexOffset;
|
||||
const c = face[ 2 ] + indexOffset;
|
||||
|
||||
indices.push( a, b, c );
|
||||
groupCount += 3;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
toJSON() {
|
||||
|
||||
const data = super.toJSON();
|
||||
|
||||
const shapes = this.parameters.shapes;
|
||||
|
||||
return toJSON( shapes, data );
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data, shapes ) {
|
||||
|
||||
const geometryShapes = [];
|
||||
|
||||
for ( let j = 0, jl = data.shapes.length; j < jl; j ++ ) {
|
||||
|
||||
const shape = shapes[ data.shapes[ j ] ];
|
||||
|
||||
geometryShapes.push( shape );
|
||||
|
||||
}
|
||||
|
||||
return new ShapeGeometry( geometryShapes, data.curveSegments );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function toJSON( shapes, data ) {
|
||||
|
||||
data.shapes = [];
|
||||
|
||||
if ( Array.isArray( shapes ) ) {
|
||||
|
||||
for ( let i = 0, l = shapes.length; i < l; i ++ ) {
|
||||
|
||||
const shape = shapes[ i ];
|
||||
|
||||
data.shapes.push( shape.uuid );
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
data.shapes.push( shapes.uuid );
|
||||
|
||||
}
|
||||
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
export { ShapeGeometry };
|
137
site/real_game/node_modules/three/src/geometries/SphereGeometry.js
generated
vendored
Normal file
137
site/real_game/node_modules/three/src/geometries/SphereGeometry.js
generated
vendored
Normal file
@ -0,0 +1,137 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
class SphereGeometry extends BufferGeometry {
|
||||
|
||||
constructor( radius = 1, widthSegments = 32, heightSegments = 16, phiStart = 0, phiLength = Math.PI * 2, thetaStart = 0, thetaLength = Math.PI ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'SphereGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
widthSegments: widthSegments,
|
||||
heightSegments: heightSegments,
|
||||
phiStart: phiStart,
|
||||
phiLength: phiLength,
|
||||
thetaStart: thetaStart,
|
||||
thetaLength: thetaLength
|
||||
};
|
||||
|
||||
widthSegments = Math.max( 3, Math.floor( widthSegments ) );
|
||||
heightSegments = Math.max( 2, Math.floor( heightSegments ) );
|
||||
|
||||
const thetaEnd = Math.min( thetaStart + thetaLength, Math.PI );
|
||||
|
||||
let index = 0;
|
||||
const grid = [];
|
||||
|
||||
const vertex = new Vector3();
|
||||
const normal = new Vector3();
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// generate vertices, normals and uvs
|
||||
|
||||
for ( let iy = 0; iy <= heightSegments; iy ++ ) {
|
||||
|
||||
const verticesRow = [];
|
||||
|
||||
const v = iy / heightSegments;
|
||||
|
||||
// special case for the poles
|
||||
|
||||
let uOffset = 0;
|
||||
|
||||
if ( iy === 0 && thetaStart === 0 ) {
|
||||
|
||||
uOffset = 0.5 / widthSegments;
|
||||
|
||||
} else if ( iy === heightSegments && thetaEnd === Math.PI ) {
|
||||
|
||||
uOffset = - 0.5 / widthSegments;
|
||||
|
||||
}
|
||||
|
||||
for ( let ix = 0; ix <= widthSegments; ix ++ ) {
|
||||
|
||||
const u = ix / widthSegments;
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = - radius * Math.cos( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
|
||||
vertex.y = radius * Math.cos( thetaStart + v * thetaLength );
|
||||
vertex.z = radius * Math.sin( phiStart + u * phiLength ) * Math.sin( thetaStart + v * thetaLength );
|
||||
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// normal
|
||||
|
||||
normal.copy( vertex ).normalize();
|
||||
normals.push( normal.x, normal.y, normal.z );
|
||||
|
||||
// uv
|
||||
|
||||
uvs.push( u + uOffset, 1 - v );
|
||||
|
||||
verticesRow.push( index ++ );
|
||||
|
||||
}
|
||||
|
||||
grid.push( verticesRow );
|
||||
|
||||
}
|
||||
|
||||
// indices
|
||||
|
||||
for ( let iy = 0; iy < heightSegments; iy ++ ) {
|
||||
|
||||
for ( let ix = 0; ix < widthSegments; ix ++ ) {
|
||||
|
||||
const a = grid[ iy ][ ix + 1 ];
|
||||
const b = grid[ iy ][ ix ];
|
||||
const c = grid[ iy + 1 ][ ix ];
|
||||
const d = grid[ iy + 1 ][ ix + 1 ];
|
||||
|
||||
if ( iy !== 0 || thetaStart > 0 ) indices.push( a, b, d );
|
||||
if ( iy !== heightSegments - 1 || thetaEnd < Math.PI ) indices.push( b, c, d );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new SphereGeometry( data.radius, data.widthSegments, data.heightSegments, data.phiStart, data.phiLength, data.thetaStart, data.thetaLength );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { SphereGeometry };
|
34
site/real_game/node_modules/three/src/geometries/TetrahedronGeometry.js
generated
vendored
Normal file
34
site/real_game/node_modules/three/src/geometries/TetrahedronGeometry.js
generated
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
import { PolyhedronGeometry } from './PolyhedronGeometry.js';
|
||||
|
||||
class TetrahedronGeometry extends PolyhedronGeometry {
|
||||
|
||||
constructor( radius = 1, detail = 0 ) {
|
||||
|
||||
const vertices = [
|
||||
1, 1, 1, - 1, - 1, 1, - 1, 1, - 1, 1, - 1, - 1
|
||||
];
|
||||
|
||||
const indices = [
|
||||
2, 1, 0, 0, 3, 2, 1, 3, 0, 2, 3, 1
|
||||
];
|
||||
|
||||
super( vertices, indices, radius, detail );
|
||||
|
||||
this.type = 'TetrahedronGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
detail: detail
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new TetrahedronGeometry( data.radius, data.detail );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { TetrahedronGeometry };
|
120
site/real_game/node_modules/three/src/geometries/TorusGeometry.js
generated
vendored
Normal file
120
site/real_game/node_modules/three/src/geometries/TorusGeometry.js
generated
vendored
Normal file
@ -0,0 +1,120 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
class TorusGeometry extends BufferGeometry {
|
||||
|
||||
constructor( radius = 1, tube = 0.4, radialSegments = 12, tubularSegments = 48, arc = Math.PI * 2 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'TorusGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
tube: tube,
|
||||
radialSegments: radialSegments,
|
||||
tubularSegments: tubularSegments,
|
||||
arc: arc
|
||||
};
|
||||
|
||||
radialSegments = Math.floor( radialSegments );
|
||||
tubularSegments = Math.floor( tubularSegments );
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// helper variables
|
||||
|
||||
const center = new Vector3();
|
||||
const vertex = new Vector3();
|
||||
const normal = new Vector3();
|
||||
|
||||
// generate vertices, normals and uvs
|
||||
|
||||
for ( let j = 0; j <= radialSegments; j ++ ) {
|
||||
|
||||
for ( let i = 0; i <= tubularSegments; i ++ ) {
|
||||
|
||||
const u = i / tubularSegments * arc;
|
||||
const v = j / radialSegments * Math.PI * 2;
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = ( radius + tube * Math.cos( v ) ) * Math.cos( u );
|
||||
vertex.y = ( radius + tube * Math.cos( v ) ) * Math.sin( u );
|
||||
vertex.z = tube * Math.sin( v );
|
||||
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// normal
|
||||
|
||||
center.x = radius * Math.cos( u );
|
||||
center.y = radius * Math.sin( u );
|
||||
normal.subVectors( vertex, center ).normalize();
|
||||
|
||||
normals.push( normal.x, normal.y, normal.z );
|
||||
|
||||
// uv
|
||||
|
||||
uvs.push( i / tubularSegments );
|
||||
uvs.push( j / radialSegments );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// generate indices
|
||||
|
||||
for ( let j = 1; j <= radialSegments; j ++ ) {
|
||||
|
||||
for ( let i = 1; i <= tubularSegments; i ++ ) {
|
||||
|
||||
// indices
|
||||
|
||||
const a = ( tubularSegments + 1 ) * j + i - 1;
|
||||
const b = ( tubularSegments + 1 ) * ( j - 1 ) + i - 1;
|
||||
const c = ( tubularSegments + 1 ) * ( j - 1 ) + i;
|
||||
const d = ( tubularSegments + 1 ) * j + i;
|
||||
|
||||
// faces
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( b, c, d );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new TorusGeometry( data.radius, data.tube, data.radialSegments, data.tubularSegments, data.arc );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { TorusGeometry };
|
167
site/real_game/node_modules/three/src/geometries/TorusKnotGeometry.js
generated
vendored
Normal file
167
site/real_game/node_modules/three/src/geometries/TorusKnotGeometry.js
generated
vendored
Normal file
@ -0,0 +1,167 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
class TorusKnotGeometry extends BufferGeometry {
|
||||
|
||||
constructor( radius = 1, tube = 0.4, tubularSegments = 64, radialSegments = 8, p = 2, q = 3 ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'TorusKnotGeometry';
|
||||
|
||||
this.parameters = {
|
||||
radius: radius,
|
||||
tube: tube,
|
||||
tubularSegments: tubularSegments,
|
||||
radialSegments: radialSegments,
|
||||
p: p,
|
||||
q: q
|
||||
};
|
||||
|
||||
tubularSegments = Math.floor( tubularSegments );
|
||||
radialSegments = Math.floor( radialSegments );
|
||||
|
||||
// buffers
|
||||
|
||||
const indices = [];
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
|
||||
// helper variables
|
||||
|
||||
const vertex = new Vector3();
|
||||
const normal = new Vector3();
|
||||
|
||||
const P1 = new Vector3();
|
||||
const P2 = new Vector3();
|
||||
|
||||
const B = new Vector3();
|
||||
const T = new Vector3();
|
||||
const N = new Vector3();
|
||||
|
||||
// generate vertices, normals and uvs
|
||||
|
||||
for ( let i = 0; i <= tubularSegments; ++ i ) {
|
||||
|
||||
// the radian "u" is used to calculate the position on the torus curve of the current tubular segment
|
||||
|
||||
const u = i / tubularSegments * p * Math.PI * 2;
|
||||
|
||||
// now we calculate two points. P1 is our current position on the curve, P2 is a little farther ahead.
|
||||
// these points are used to create a special "coordinate space", which is necessary to calculate the correct vertex positions
|
||||
|
||||
calculatePositionOnCurve( u, p, q, radius, P1 );
|
||||
calculatePositionOnCurve( u + 0.01, p, q, radius, P2 );
|
||||
|
||||
// calculate orthonormal basis
|
||||
|
||||
T.subVectors( P2, P1 );
|
||||
N.addVectors( P2, P1 );
|
||||
B.crossVectors( T, N );
|
||||
N.crossVectors( B, T );
|
||||
|
||||
// normalize B, N. T can be ignored, we don't use it
|
||||
|
||||
B.normalize();
|
||||
N.normalize();
|
||||
|
||||
for ( let j = 0; j <= radialSegments; ++ j ) {
|
||||
|
||||
// now calculate the vertices. they are nothing more than an extrusion of the torus curve.
|
||||
// because we extrude a shape in the xy-plane, there is no need to calculate a z-value.
|
||||
|
||||
const v = j / radialSegments * Math.PI * 2;
|
||||
const cx = - tube * Math.cos( v );
|
||||
const cy = tube * Math.sin( v );
|
||||
|
||||
// now calculate the final vertex position.
|
||||
// first we orient the extrusion with our basis vectors, then we add it to the current position on the curve
|
||||
|
||||
vertex.x = P1.x + ( cx * N.x + cy * B.x );
|
||||
vertex.y = P1.y + ( cx * N.y + cy * B.y );
|
||||
vertex.z = P1.z + ( cx * N.z + cy * B.z );
|
||||
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
// normal (P1 is always the center/origin of the extrusion, thus we can use it to calculate the normal)
|
||||
|
||||
normal.subVectors( vertex, P1 ).normalize();
|
||||
|
||||
normals.push( normal.x, normal.y, normal.z );
|
||||
|
||||
// uv
|
||||
|
||||
uvs.push( i / tubularSegments );
|
||||
uvs.push( j / radialSegments );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// generate indices
|
||||
|
||||
for ( let j = 1; j <= tubularSegments; j ++ ) {
|
||||
|
||||
for ( let i = 1; i <= radialSegments; i ++ ) {
|
||||
|
||||
// indices
|
||||
|
||||
const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
|
||||
const b = ( radialSegments + 1 ) * j + ( i - 1 );
|
||||
const c = ( radialSegments + 1 ) * j + i;
|
||||
const d = ( radialSegments + 1 ) * ( j - 1 ) + i;
|
||||
|
||||
// faces
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( b, c, d );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
// this function calculates the current position on the torus curve
|
||||
|
||||
function calculatePositionOnCurve( u, p, q, radius, position ) {
|
||||
|
||||
const cu = Math.cos( u );
|
||||
const su = Math.sin( u );
|
||||
const quOverP = q / p * u;
|
||||
const cs = Math.cos( quOverP );
|
||||
|
||||
position.x = radius * ( 2 + cs ) * 0.5 * cu;
|
||||
position.y = radius * ( 2 + cs ) * su * 0.5;
|
||||
position.z = radius * Math.sin( quOverP ) * 0.5;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
return new TorusKnotGeometry( data.radius, data.tube, data.tubularSegments, data.radialSegments, data.p, data.q );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export { TorusKnotGeometry };
|
203
site/real_game/node_modules/three/src/geometries/TubeGeometry.js
generated
vendored
Normal file
203
site/real_game/node_modules/three/src/geometries/TubeGeometry.js
generated
vendored
Normal file
@ -0,0 +1,203 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import * as Curves from '../extras/curves/Curves.js';
|
||||
import { Vector2 } from '../math/Vector2.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
class TubeGeometry extends BufferGeometry {
|
||||
|
||||
constructor( path = new Curves[ 'QuadraticBezierCurve3' ]( new Vector3( - 1, - 1, 0 ), new Vector3( - 1, 1, 0 ), new Vector3( 1, 1, 0 ) ), tubularSegments = 64, radius = 1, radialSegments = 8, closed = false ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'TubeGeometry';
|
||||
|
||||
this.parameters = {
|
||||
path: path,
|
||||
tubularSegments: tubularSegments,
|
||||
radius: radius,
|
||||
radialSegments: radialSegments,
|
||||
closed: closed
|
||||
};
|
||||
|
||||
const frames = path.computeFrenetFrames( tubularSegments, closed );
|
||||
|
||||
// expose internals
|
||||
|
||||
this.tangents = frames.tangents;
|
||||
this.normals = frames.normals;
|
||||
this.binormals = frames.binormals;
|
||||
|
||||
// helper variables
|
||||
|
||||
const vertex = new Vector3();
|
||||
const normal = new Vector3();
|
||||
const uv = new Vector2();
|
||||
let P = new Vector3();
|
||||
|
||||
// buffer
|
||||
|
||||
const vertices = [];
|
||||
const normals = [];
|
||||
const uvs = [];
|
||||
const indices = [];
|
||||
|
||||
// create buffer data
|
||||
|
||||
generateBufferData();
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setIndex( indices );
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
this.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
||||
this.setAttribute( 'uv', new Float32BufferAttribute( uvs, 2 ) );
|
||||
|
||||
// functions
|
||||
|
||||
function generateBufferData() {
|
||||
|
||||
for ( let i = 0; i < tubularSegments; i ++ ) {
|
||||
|
||||
generateSegment( i );
|
||||
|
||||
}
|
||||
|
||||
// if the geometry is not closed, generate the last row of vertices and normals
|
||||
// at the regular position on the given path
|
||||
//
|
||||
// if the geometry is closed, duplicate the first row of vertices and normals (uvs will differ)
|
||||
|
||||
generateSegment( ( closed === false ) ? tubularSegments : 0 );
|
||||
|
||||
// uvs are generated in a separate function.
|
||||
// this makes it easy compute correct values for closed geometries
|
||||
|
||||
generateUVs();
|
||||
|
||||
// finally create faces
|
||||
|
||||
generateIndices();
|
||||
|
||||
}
|
||||
|
||||
function generateSegment( i ) {
|
||||
|
||||
// we use getPointAt to sample evenly distributed points from the given path
|
||||
|
||||
P = path.getPointAt( i / tubularSegments, P );
|
||||
|
||||
// retrieve corresponding normal and binormal
|
||||
|
||||
const N = frames.normals[ i ];
|
||||
const B = frames.binormals[ i ];
|
||||
|
||||
// generate normals and vertices for the current segment
|
||||
|
||||
for ( let j = 0; j <= radialSegments; j ++ ) {
|
||||
|
||||
const v = j / radialSegments * Math.PI * 2;
|
||||
|
||||
const sin = Math.sin( v );
|
||||
const cos = - Math.cos( v );
|
||||
|
||||
// normal
|
||||
|
||||
normal.x = ( cos * N.x + sin * B.x );
|
||||
normal.y = ( cos * N.y + sin * B.y );
|
||||
normal.z = ( cos * N.z + sin * B.z );
|
||||
normal.normalize();
|
||||
|
||||
normals.push( normal.x, normal.y, normal.z );
|
||||
|
||||
// vertex
|
||||
|
||||
vertex.x = P.x + radius * normal.x;
|
||||
vertex.y = P.y + radius * normal.y;
|
||||
vertex.z = P.z + radius * normal.z;
|
||||
|
||||
vertices.push( vertex.x, vertex.y, vertex.z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function generateIndices() {
|
||||
|
||||
for ( let j = 1; j <= tubularSegments; j ++ ) {
|
||||
|
||||
for ( let i = 1; i <= radialSegments; i ++ ) {
|
||||
|
||||
const a = ( radialSegments + 1 ) * ( j - 1 ) + ( i - 1 );
|
||||
const b = ( radialSegments + 1 ) * j + ( i - 1 );
|
||||
const c = ( radialSegments + 1 ) * j + i;
|
||||
const d = ( radialSegments + 1 ) * ( j - 1 ) + i;
|
||||
|
||||
// faces
|
||||
|
||||
indices.push( a, b, d );
|
||||
indices.push( b, c, d );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function generateUVs() {
|
||||
|
||||
for ( let i = 0; i <= tubularSegments; i ++ ) {
|
||||
|
||||
for ( let j = 0; j <= radialSegments; j ++ ) {
|
||||
|
||||
uv.x = i / tubularSegments;
|
||||
uv.y = j / radialSegments;
|
||||
|
||||
uvs.push( uv.x, uv.y );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
toJSON() {
|
||||
|
||||
const data = super.toJSON();
|
||||
|
||||
data.path = this.parameters.path.toJSON();
|
||||
|
||||
return data;
|
||||
|
||||
}
|
||||
|
||||
static fromJSON( data ) {
|
||||
|
||||
// This only works for built-in curves (e.g. CatmullRomCurve3).
|
||||
// User defined curves or instances of CurvePath will not be deserialized.
|
||||
return new TubeGeometry(
|
||||
new Curves[ data.path.type ]().fromJSON( data.path ),
|
||||
data.tubularSegments,
|
||||
data.radius,
|
||||
data.radialSegments,
|
||||
data.closed
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { TubeGeometry };
|
147
site/real_game/node_modules/three/src/geometries/WireframeGeometry.js
generated
vendored
Normal file
147
site/real_game/node_modules/three/src/geometries/WireframeGeometry.js
generated
vendored
Normal file
@ -0,0 +1,147 @@
|
||||
import { BufferGeometry } from '../core/BufferGeometry.js';
|
||||
import { Float32BufferAttribute } from '../core/BufferAttribute.js';
|
||||
import { Vector3 } from '../math/Vector3.js';
|
||||
|
||||
class WireframeGeometry extends BufferGeometry {
|
||||
|
||||
constructor( geometry = null ) {
|
||||
|
||||
super();
|
||||
|
||||
this.type = 'WireframeGeometry';
|
||||
|
||||
this.parameters = {
|
||||
geometry: geometry
|
||||
};
|
||||
|
||||
if ( geometry !== null ) {
|
||||
|
||||
// buffer
|
||||
|
||||
const vertices = [];
|
||||
const edges = new Set();
|
||||
|
||||
// helper variables
|
||||
|
||||
const start = new Vector3();
|
||||
const end = new Vector3();
|
||||
|
||||
if ( geometry.index !== null ) {
|
||||
|
||||
// indexed BufferGeometry
|
||||
|
||||
const position = geometry.attributes.position;
|
||||
const indices = geometry.index;
|
||||
let groups = geometry.groups;
|
||||
|
||||
if ( groups.length === 0 ) {
|
||||
|
||||
groups = [ { start: 0, count: indices.count, materialIndex: 0 } ];
|
||||
|
||||
}
|
||||
|
||||
// create a data structure that contains all edges without duplicates
|
||||
|
||||
for ( let o = 0, ol = groups.length; o < ol; ++ o ) {
|
||||
|
||||
const group = groups[ o ];
|
||||
|
||||
const groupStart = group.start;
|
||||
const groupCount = group.count;
|
||||
|
||||
for ( let i = groupStart, l = ( groupStart + groupCount ); i < l; i += 3 ) {
|
||||
|
||||
for ( let j = 0; j < 3; j ++ ) {
|
||||
|
||||
const index1 = indices.getX( i + j );
|
||||
const index2 = indices.getX( i + ( j + 1 ) % 3 );
|
||||
|
||||
start.fromBufferAttribute( position, index1 );
|
||||
end.fromBufferAttribute( position, index2 );
|
||||
|
||||
if ( isUniqueEdge( start, end, edges ) === true ) {
|
||||
|
||||
vertices.push( start.x, start.y, start.z );
|
||||
vertices.push( end.x, end.y, end.z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// non-indexed BufferGeometry
|
||||
|
||||
const position = geometry.attributes.position;
|
||||
|
||||
for ( let i = 0, l = ( position.count / 3 ); i < l; i ++ ) {
|
||||
|
||||
for ( let j = 0; j < 3; j ++ ) {
|
||||
|
||||
// three edges per triangle, an edge is represented as (index1, index2)
|
||||
// e.g. the first triangle has the following edges: (0,1),(1,2),(2,0)
|
||||
|
||||
const index1 = 3 * i + j;
|
||||
const index2 = 3 * i + ( ( j + 1 ) % 3 );
|
||||
|
||||
start.fromBufferAttribute( position, index1 );
|
||||
end.fromBufferAttribute( position, index2 );
|
||||
|
||||
if ( isUniqueEdge( start, end, edges ) === true ) {
|
||||
|
||||
vertices.push( start.x, start.y, start.z );
|
||||
vertices.push( end.x, end.y, end.z );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// build geometry
|
||||
|
||||
this.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
copy( source ) {
|
||||
|
||||
super.copy( source );
|
||||
|
||||
this.parameters = Object.assign( {}, source.parameters );
|
||||
|
||||
return this;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function isUniqueEdge( start, end, edges ) {
|
||||
|
||||
const hash1 = `${start.x},${start.y},${start.z}-${end.x},${end.y},${end.z}`;
|
||||
const hash2 = `${end.x},${end.y},${end.z}-${start.x},${start.y},${start.z}`; // coincident edge
|
||||
|
||||
if ( edges.has( hash1 ) === true || edges.has( hash2 ) === true ) {
|
||||
|
||||
return false;
|
||||
|
||||
} else {
|
||||
|
||||
edges.add( hash1 );
|
||||
edges.add( hash2 );
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
export { WireframeGeometry };
|
Reference in New Issue
Block a user