Skip to content

Commit ba2d65b

Browse files
committed
threejsr rename and significant refactor
1 parent 5874e71 commit ba2d65b

12 files changed

+143
-62
lines changed

.babelrc

+4-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,6 @@
11
{
2-
"presets": [
3-
[
4-
"env",
5-
{
6-
"modules": false
7-
}
8-
],
9-
"react",
10-
"stage-0"
11-
]
2+
"presets": [
3+
"@babel/preset-env",
4+
"@babel/preset-react"
5+
]
126
}

.eslintrc.js

-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ module.exports = {
2929
'react/jsx-uses-react': 'error',
3030
'react/jsx-uses-vars': 'error',
3131
},
32-
parser: 'babel-eslint',
3332
parserOptions: {
3433
ecmaVersion: 8, // optional, recommended 6+
3534
},

README.md

+75-1
Original file line numberDiff line numberDiff line change
@@ -1 +1,75 @@
1-
# threejs-react-redux
1+
# ThreeJSR
2+
3+
A library for building [Three.js](https://threejs.org/) projects using React and Redux.
4+
5+
See example usage: https://github.com/edwmurph/threejs
6+
7+
# Installation
8+
9+
```
10+
npm i git+ssh://[email protected]:edwmurph/threeJSR.git
11+
```
12+
13+
# Usage
14+
15+
1. Add ThreeJSR `timestamp` reducer to your root reducers:
16+
```
17+
// src/reducers/index.js
18+
import { combineReducers } from 'redux'
19+
import { timestamp } from 'threeJSR'
20+
21+
export default combineReducers({
22+
timestamp
23+
...
24+
})
25+
```
26+
27+
2. Extend ThreeJSR to build your own threejs scene:
28+
```
29+
// src/threejs/sphere.js
30+
import * as THREE from 'three'
31+
import { ThreeJSR } from 'threeJSR'
32+
33+
export default class Sphere extends ThreeJSR {
34+
renderNextFrame({ timestamp }) {
35+
this.mesh.rotation.x += 0.001
36+
this.mesh.rotation.y += 0.001
37+
38+
return super.renderNextFrame(timestamp)
39+
}
40+
41+
createThreeScene() {
42+
this.scene = new THREE.Scene()
43+
44+
this.camera = new THREE.PerspectiveCamera(75, 0, 0.1, 1000)
45+
this.camera.position.z = 100
46+
47+
const geometry = new THREE.SphereGeometry(40, 50, 30)
48+
const material = new THREE.MeshLambertMaterial({ color: 0xffffff, wireframe: true })
49+
50+
this.mesh = new THREE.Mesh(geometry, material)
51+
this.scene.add(this.mesh)
52+
53+
const spotLight = new THREE.SpotLight(0xffffff)
54+
spotLight.position.set(100, 10, 100)
55+
56+
this.scene.add(spotLight)
57+
}
58+
}
59+
```
60+
61+
3. Add SafeThreeJSRComponent to one of your components:
62+
```
63+
// src/components/App.js
64+
import React from 'react'
65+
import Sphere from '../threejs/sphere'
66+
import { SafeThreeJSRComponent } from 'threeJSR'
67+
68+
export default class App extends React.Component {
69+
render() {
70+
return (
71+
<SafeThreeJSRComponent ThreeJSR={Sphere} />
72+
)
73+
}
74+
}
75+
```

package.json

+8-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
2-
"name": "trr",
2+
"name": "threeJSR",
33
"version": "1.0.0",
4-
"description": "A library for creating safe threejs components",
4+
"description": "A library for creating threejs components with react + redux",
55
"main": "build/index.js",
66
"scripts": {
77
"build": "babel src -d build",
@@ -14,25 +14,21 @@
1414
},
1515
"repository": {
1616
"type": "git",
17-
"url": "git+https://github.com/edwmurph/trr.git"
17+
"url": "git+https://github.com/edwmurph/threeJSR.git"
1818
},
1919
"author": "",
2020
"license": "ISC",
2121
"devDependencies": {
22-
"babel-cli": "6.26.0",
23-
"babel-preset-env": "1.7.0",
24-
"babel-preset-react": "6.24.1",
25-
"babel-preset-stage-0": "6.24.1",
22+
"@babel/cli": "7.2.3",
23+
"@babel/core": "7.3.4",
24+
"@babel/preset-env": "7.3.4",
25+
"@babel/preset-react": "7.0.0",
2626
"eslint": "5.15.2",
2727
"eslint-config-standard": "12.0.0",
2828
"eslint-plugin-import": "2.16.0",
2929
"eslint-plugin-node": "8.0.1",
3030
"eslint-plugin-promise": "4.0.1",
3131
"eslint-plugin-react": "7.12.4",
32-
"eslint-plugin-standard": "4.0.0",
33-
"react": "16.8.4",
34-
"react-redux": "6.0.1",
35-
"redux": "4.0.1",
36-
"three": "0.102.1"
32+
"eslint-plugin-standard": "4.0.0"
3733
}
3834
}

src/SafeThreeJS.js

-13
This file was deleted.

src/ThreeJS.js renamed to src/ThreeJSR.js

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as THREE from 'three'
22

3-
export default class ThreeJS {
3+
export default class ThreeJSR {
44
constructor(ref, newFrameHook) {
55
this.ref = ref
66
this.newFrameHook = newFrameHook
@@ -9,7 +9,7 @@ export default class ThreeJS {
99

1010
// USAGE: call inside componentDidMount()
1111
afterMount() {
12-
ThreeJS.verifyEnv()
12+
ThreeJSR.verifyEnv()
1313
window.addEventListener('resize', this.onResize.bind(this))
1414

1515
this.createThreeScene()
@@ -39,7 +39,7 @@ export default class ThreeJS {
3939
}
4040

4141
createThreeScene() {
42-
throw new Error('must implement ThreeJS.createThreeScene()')
42+
throw new Error('must implement createThreeScene()')
4343
}
4444

4545
onResize() {
@@ -59,7 +59,7 @@ export default class ThreeJS {
5959
throw new Error()
6060
}
6161
} catch (e) {
62-
throw new Error('WebGL is not available on your system')
62+
throw new Error('WebGL is not available on your browser')
6363
}
6464
}
6565
}

src/TodaysDate.js

-4
This file was deleted.
File renamed without changes.
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import React from 'react'
2+
import ThreeJSRComponent from './ThreeJSRComponent'
3+
import ErrorBoundary from './ErrorBoundary'
4+
5+
export default class SafeThreeJSRComponent extends React.Component {
6+
render() {
7+
return (
8+
<ErrorBoundary>
9+
<ThreeJSRComponent
10+
ThreeJSR={this.props.ThreeJSR}
11+
events={this.props.events}
12+
/>
13+
</ErrorBoundary>
14+
)
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,24 @@
11
import React from 'react'
22
import { connect } from 'react-redux'
33

4-
class Component extends React.Component {
4+
class ThreeJSRComponent extends React.Component {
55
constructor(props) {
66
super(props)
77
this.ref = React.createRef()
8-
this.threejs = new this.props.ThreeJS(
8+
this.threejs = new this.props.ThreeJSR(
99
this.ref,
1010
timestamp => this.props.update({ timestamp }),
1111
)
12+
13+
this.events = {}
14+
for (let key in this.props.events || {}) {
15+
this.events[key] = function(e) {
16+
return this.props.threeJSR(
17+
this.props.events[key](e)
18+
)
19+
}
20+
this.events[key] = this.events[key].bind(this)
21+
}
1222
}
1323

1424
componentDidMount() {
@@ -25,15 +35,15 @@ class Component extends React.Component {
2535

2636
render() {
2737
return (
28-
<div ref={this.ref} onMouseDown={this.props.mouseDown} />
38+
<div ref={this.ref} {...this.events} />
2939
)
3040
}
3141
}
3242

3343
function mapStateToProps(state) {
3444
return {
3545
timestamp: state.timestamp,
36-
mouse: state.mouse,
46+
threejsr: state.threejsr,
3747
}
3848
}
3949

@@ -43,14 +53,11 @@ function mapDispatchToProps(dispatch) {
4353
type: 'TIMESTAMP',
4454
timestamp,
4555
}),
46-
mouseDown: e => dispatch({
47-
type: 'MOUSE_DOWN',
48-
mouse: {
49-
x: e.screenX,
50-
y: e.screenY,
51-
},
52-
}),
56+
threeJSR: e => dispatch({
57+
type: 'THREEJSR',
58+
e
59+
})
5360
}
5461
}
5562

56-
export default connect(mapStateToProps, mapDispatchToProps)(Component)
63+
export default connect(mapStateToProps, mapDispatchToProps)(ThreeJSRComponent)

src/index.js

+7-5
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import SafeThreeJS from './SafeThreeJS'
2-
import ThreeJS from './ThreeJS'
1+
import SafeThreeJSRComponent from './components/SafeThreeJSRComponent'
2+
import ThreeJSR from './ThreeJSR'
3+
import reducer from './reducers/index'
34

4-
export default {
5-
SafeThreeJS,
6-
ThreeJS
5+
export {
6+
SafeThreeJSRComponent,
7+
ThreeJSR,
8+
reducer
79
}

src/reducers/index.js

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
export default function threejsr (previousState, action) {
2+
switch (action.type) {
3+
case 'TIMESTAMP':
4+
return { timestamp: action.timestamp }
5+
case 'THREEJSR':
6+
return Object.assign({}, action.e)
7+
default:
8+
return {}
9+
}
10+
}

0 commit comments

Comments
 (0)