├── LICENSE ├── README.md ├── dist ├── aframe-raytrace-component.js └── aframe-raytrace-component.min.js ├── examples └── basic │ └── index.html ├── index.html ├── index.js └── package.json /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2017 Andrew Fraticelli <andrew.fraticelli@gmail.com> 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## aframe-raytrace-component 2 | 3 | [![Version](http://img.shields.io/npm/v/aframe-raytrace-component.svg?style=flat-square)](https://npmjs.org/package/aframe-raytrace-component) 4 | [![License](http://img.shields.io/npm/l/aframe-raytrace-component.svg?style=flat-square)](https://npmjs.org/package/aframe-raytrace-component) 5 | 6 | An [A-Frame](https://aframe.io) component for placing raytraced surfaces in a scene. 7 | 8 | Click here to view demo 9 | 10 | 11 | 12 | ### API 13 | 14 | | Property | Description | Default Value | 15 | | -------- | ----------- | ------------- | 16 | | shader | ID of a shader in a script tag. | (none) | 17 | | transparent | Whether the result of the shader is alpha blended with what's behind it. | false | 18 | | backside | Whether the shader is drawn on the frontfaces or the backfaces of the mesh. | false | 19 | 20 | ### Installation 21 | 22 | #### Browser 23 | 24 | Install and use by directly including the [browser files](dist): 25 | 26 | ```html 27 | 28 | My A-Frame Scene 29 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | ``` 52 | 53 | 54 | Or with [angle](https://npmjs.com/package/angle/), you can install the proper 55 | version of the component straight into your HTML file, respective to your 56 | version of A-Frame: 57 | 58 | ```sh 59 | angle install aframe-raytrace-component 60 | ``` 61 | 62 | #### npm 63 | 64 | Install via npm: 65 | 66 | ```bash 67 | npm install aframe-raytrace-component 68 | ``` 69 | 70 | Then require and use. 71 | 72 | ```js 73 | require('aframe'); 74 | require('aframe-raytrace-component'); 75 | ``` 76 | -------------------------------------------------------------------------------- /dist/aframe-raytrace-component.js: -------------------------------------------------------------------------------- 1 | /******/ (function(modules) { // webpackBootstrap 2 | /******/ // The module cache 3 | /******/ var installedModules = {}; 4 | 5 | /******/ // The require function 6 | /******/ function __webpack_require__(moduleId) { 7 | 8 | /******/ // Check if module is in cache 9 | /******/ if(installedModules[moduleId]) 10 | /******/ return installedModules[moduleId].exports; 11 | 12 | /******/ // Create a new module (and put it into the cache) 13 | /******/ var module = installedModules[moduleId] = { 14 | /******/ exports: {}, 15 | /******/ id: moduleId, 16 | /******/ loaded: false 17 | /******/ }; 18 | 19 | /******/ // Execute the module function 20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 21 | 22 | /******/ // Flag the module as loaded 23 | /******/ module.loaded = true; 24 | 25 | /******/ // Return the exports of the module 26 | /******/ return module.exports; 27 | /******/ } 28 | 29 | 30 | /******/ // expose the modules object (__webpack_modules__) 31 | /******/ __webpack_require__.m = modules; 32 | 33 | /******/ // expose the module cache 34 | /******/ __webpack_require__.c = installedModules; 35 | 36 | /******/ // __webpack_public_path__ 37 | /******/ __webpack_require__.p = ""; 38 | 39 | /******/ // Load entry module and return exports 40 | /******/ return __webpack_require__(0); 41 | /******/ }) 42 | /************************************************************************/ 43 | /******/ ([ 44 | /* 0 */ 45 | /***/ (function(module, exports) { 46 | 47 | if (typeof AFRAME === 'undefined') { 48 | throw new Error('Component attempted to register before AFRAME was available.'); 49 | } 50 | 51 | AFRAME.registerComponent('raytrace', { 52 | 53 | schema: { 54 | shader:{type:'selector'}, 55 | transparent:{type:'boolean',default:false}, 56 | backside:{type:'boolean',default:false} 57 | }, 58 | 59 | init: function () { 60 | 61 | this.myMesh = this.el.getObject3D('mesh'); 62 | this.myShaderMaterial = new THREE.ShaderMaterial({ 63 | 64 | vertexShader: 65 | "precision mediump float;\n"+ 66 | "varying vec3 localSurfacePos;\n"+ 67 | "void main() {\n"+ 68 | "gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\n"+ 69 | "localSurfacePos = position;\n"+ 70 | "}", 71 | 72 | uniforms:{ 73 | time:{value:0}, 74 | localCameraPos:{value:new THREE.Vector3(0,0,0)} 75 | }, 76 | 77 | }); 78 | this.myMesh.material = this.myShaderMaterial; 79 | 80 | var self = this; 81 | this.myMesh.onBeforeRender = function(renderer,scene,camera,geometry,material,group){ 82 | 83 | self.myShaderMaterial.uniforms.localCameraPos.value.setFromMatrixPosition(camera.matrixWorld); 84 | self.myMesh.worldToLocal(self.myShaderMaterial.uniforms.localCameraPos.value); 85 | 86 | }; 87 | 88 | }, 89 | remove:function(){ 90 | this.myMesh.onBeforeRender = null; 91 | }, 92 | update: function (oldData) { 93 | this.myShaderMaterial.fragmentShader = this.data.shader.textContent; 94 | this.myShaderMaterial.side = this.data.backside?THREE.BackSide:THREE.FrontSide; 95 | this.myShaderMaterial.transparent = this.data.transparent; 96 | }, 97 | tick: function(time,timeDelta){ 98 | this.myShaderMaterial.uniforms.time.value = time; 99 | } 100 | }); 101 | 102 | 103 | /***/ }) 104 | /******/ ]); -------------------------------------------------------------------------------- /dist/aframe-raytrace-component.min.js: -------------------------------------------------------------------------------- 1 | !function(e){function a(r){if(t[r])return t[r].exports;var i=t[r]={exports:{},id:r,loaded:!1};return e[r].call(i.exports,i,i.exports,a),i.loaded=!0,i.exports}var t={};return a.m=e,a.c=t,a.p="",a(0)}([function(e,a){if("undefined"==typeof AFRAME)throw new Error("Component attempted to register before AFRAME was available.");AFRAME.registerComponent("raytrace",{schema:{shader:{type:"selector"},transparent:{type:"boolean",default:!1},backside:{type:"boolean",default:!1}},init:function(){this.myMesh=this.el.getObject3D("mesh"),this.myShaderMaterial=new THREE.ShaderMaterial({vertexShader:"precision mediump float;\nvarying vec3 localSurfacePos;\nvoid main() {\ngl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\nlocalSurfacePos = position;\n}",uniforms:{time:{value:0},localCameraPos:{value:new THREE.Vector3(0,0,0)}}}),this.myMesh.material=this.myShaderMaterial;var e=this;this.myMesh.onBeforeRender=function(a,t,r,i,o,n){e.myShaderMaterial.uniforms.localCameraPos.value.setFromMatrixPosition(r.matrixWorld),e.myMesh.worldToLocal(e.myShaderMaterial.uniforms.localCameraPos.value)}},remove:function(){this.myMesh.onBeforeRender=null},update:function(e){this.myShaderMaterial.fragmentShader=this.data.shader.textContent,this.myShaderMaterial.side=this.data.backside?THREE.BackSide:THREE.FrontSide,this.myShaderMaterial.transparent=this.data.transparent},tick:function(e,a){this.myShaderMaterial.uniforms.time.value=e}})}]); -------------------------------------------------------------------------------- /examples/basic/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | A-Frame Raytrace Component - Basic 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 119 | 120 | 121 | 122 | 475 | 476 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 48 | 49 | 50 |

A-Frame Raytrace Component

51 | 52 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | if (typeof AFRAME === 'undefined') { 2 | throw new Error('Component attempted to register before AFRAME was available.'); 3 | } 4 | 5 | AFRAME.registerComponent('raytrace', { 6 | 7 | schema: { 8 | shader:{type:'selector'}, 9 | transparent:{type:'boolean',default:false}, 10 | backside:{type:'boolean',default:false} 11 | }, 12 | 13 | init: function () { 14 | 15 | this.myMesh = this.el.getObject3D('mesh'); 16 | this.myShaderMaterial = new THREE.ShaderMaterial({ 17 | 18 | vertexShader: 19 | "precision mediump float;\n"+ 20 | "varying vec3 localSurfacePos;\n"+ 21 | "void main() {\n"+ 22 | "gl_Position = projectionMatrix * modelViewMatrix * vec4(position,1.0);\n"+ 23 | "localSurfacePos = position;\n"+ 24 | "}", 25 | 26 | uniforms:{ 27 | time:{value:0}, 28 | localCameraPos:{value:new THREE.Vector3(0,0,0)} 29 | }, 30 | 31 | }); 32 | this.myMesh.material = this.myShaderMaterial; 33 | 34 | var self = this; 35 | this.myMesh.onBeforeRender = function(renderer,scene,camera,geometry,material,group){ 36 | 37 | self.myShaderMaterial.uniforms.localCameraPos.value.setFromMatrixPosition(camera.matrixWorld); 38 | self.myMesh.worldToLocal(self.myShaderMaterial.uniforms.localCameraPos.value); 39 | 40 | }; 41 | 42 | }, 43 | remove:function(){ 44 | this.myMesh.onBeforeRender = null; 45 | }, 46 | update: function (oldData) { 47 | this.myShaderMaterial.fragmentShader = this.data.shader.textContent; 48 | this.myShaderMaterial.side = this.data.backside?THREE.BackSide:THREE.FrontSide; 49 | this.myShaderMaterial.transparent = this.data.transparent; 50 | }, 51 | tick: function(time,timeDelta){ 52 | this.myShaderMaterial.uniforms.time.value = time; 53 | } 54 | }); 55 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "aframe-raytrace-component", 3 | "version": "1.1.2", 4 | "description": "An A-Frame component for placing raytraced surfaces in a scene.", 5 | "main": "index.js", 6 | "cdn": "dist/aframe-raytrace-component.min.js", 7 | "scripts": { 8 | "dev": "budo index.js:dist/aframe-raytrace-component.min.js --port 7000 --live --open", 9 | "dist": "webpack index.js dist/aframe-raytrace-component.js && webpack -p index.js dist/aframe-raytrace-component.min.js", 10 | "lint": "semistandard -v | snazzy", 11 | "prepublish": "npm run dist", 12 | "ghpages": "ghpages", 13 | "start": "npm run dev", 14 | "test": "karma start ./tests/karma.conf.js", 15 | "test:firefox": "karma start ./tests/karma.conf.js --browsers Firefox", 16 | "test:chrome": "karma start ./tests/karma.conf.js --browsers Chrome" 17 | }, 18 | "repository": { 19 | "type": "git", 20 | "url": "git+https://github.com/omgitsraven/aframe-raytrace-component.git" 21 | }, 22 | "keywords": [ 23 | "aframe", 24 | "aframe-component", 25 | "aframe-vr", 26 | "vr", 27 | "mozvr", 28 | "webvr", 29 | "raytrace" 30 | ], 31 | "author": "Hazel Fraticelli ", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/omgitsraven/aframe-raytrace-component/issues" 35 | }, 36 | "homepage": "https://github.com/omgitsraven/aframe-raytrace-component#readme", 37 | "devDependencies": { 38 | "aframe": "*", 39 | "browserify": "^13.0.0", 40 | "budo": "^8.2.2", 41 | "chai": "^3.4.1", 42 | "chai-shallow-deep-equal": "^1.3.0", 43 | "ghpages": "^0.0.8", 44 | "karma": "^0.13.15", 45 | "karma-browserify": "^4.4.2", 46 | "karma-chai-shallow-deep-equal": "0.0.4", 47 | "karma-chrome-launcher": "2.0.0", 48 | "karma-env-preprocessor": "^0.1.1", 49 | "karma-firefox-launcher": "^0.1.7", 50 | "karma-mocha": "^0.2.1", 51 | "karma-mocha-reporter": "^1.1.3", 52 | "karma-sinon-chai": "^1.1.0", 53 | "mocha": "^2.3.4", 54 | "randomcolor": "^0.4.4", 55 | "semistandard": "^8.0.0", 56 | "shelljs": "^0.7.0", 57 | "sinon": "^1.17.5", 58 | "sinon-chai": "^2.8.0", 59 | "shx": "^0.1.1", 60 | "snazzy": "^4.0.0", 61 | "webpack": "^1.13.0" 62 | }, 63 | "semistandard": { 64 | "globals": [ 65 | "AFRAME", 66 | "THREE" 67 | ], 68 | "ignore": [ 69 | "examples/build.js", 70 | "dist/**" 71 | ] 72 | } 73 | } 74 | --------------------------------------------------------------------------------