From 7f25fecb5fc5830a791aa8d97b5de527352ceef2 Mon Sep 17 00:00:00 2001
From: Robert Long <robert@robertlong.me>
Date: Mon, 6 Aug 2018 18:06:30 -0700
Subject: [PATCH] Add gamma-factor component .

---
 src/avatar-selector.js         |  1 +
 src/components/gamma-factor.js | 43 ++++++++++++++++++++++++++++++++++
 src/hub.html                   |  1 +
 src/hub.js                     |  1 +
 4 files changed, 46 insertions(+)
 create mode 100644 src/components/gamma-factor.js

diff --git a/src/avatar-selector.js b/src/avatar-selector.js
index 0b0aead55..1ded01b45 100644
--- a/src/avatar-selector.js
+++ b/src/avatar-selector.js
@@ -15,6 +15,7 @@ import "three/examples/js/loaders/GLTFLoader";
 import "./components/animation-mixer";
 import "./components/audio-feedback";
 import "./components/loop-animation";
+import "./components/gamma-factor";
 import "./gltf-component-mappings";
 import { avatars } from "./assets/avatars/avatars";
 
diff --git a/src/components/gamma-factor.js b/src/components/gamma-factor.js
new file mode 100644
index 000000000..c3ffa4fce
--- /dev/null
+++ b/src/components/gamma-factor.js
@@ -0,0 +1,43 @@
+AFRAME.registerComponent("gamma-factor", {
+  schema: {
+    gammaFactor: { type: "number", default: 2.2 }
+  },
+
+  init() {
+    const el = this.el;
+
+    if (!el.isScene) {
+      console.warn("gamma-factor component can only be applied to <a-scene>");
+    }
+  },
+
+  update(prevData) {
+    const data = this.data;
+    const sceneEl = this.el;
+    const renderer = sceneEl.renderer;
+    let needsShaderUpdate = false;
+
+    if (data.gammaFactor !== prevData.gammaFactor) {
+      renderer.gammaFactor = data.gammaFactor;
+      needsShaderUpdate = true;
+    }
+
+    if (!needsShaderUpdate || sceneEl.time === 0) {
+      return;
+    }
+
+    sceneEl.object3D.traverse(function(node) {
+      if (!node.isMesh) {
+        return;
+      }
+
+      if (Array.isArray(node.material)) {
+        node.material.forEach(function(material) {
+          material.needsUpdate = true;
+        });
+      } else {
+        node.material.needsUpdate = true;
+      }
+    });
+  }
+});
diff --git a/src/hub.html b/src/hub.html
index 601c0d52b..aa2b0b31e 100644
--- a/src/hub.html
+++ b/src/hub.html
@@ -25,6 +25,7 @@
 
     <a-scene
         renderer="antialias: true; gammaOutput: true; sortObjects: true; physicallyCorrectLights: true;"
+        gamma-factor
         networked-scene="adapter: janus; audio: true; debug: true; connectOnLoad: false;"
         physics="gravity: -6; debug: false;"
         mute-mic="eventSrc: a-scene; toggleEvents: action_mute"
diff --git a/src/hub.js b/src/hub.js
index 592b30b01..68798e671 100644
--- a/src/hub.js
+++ b/src/hub.js
@@ -73,6 +73,7 @@ import "./components/position-at-box-shape-border";
 import "./components/remove-networked-object-button";
 import "./components/destroy-at-extreme-distances";
 import "./components/media-loader";
+import "./components/gamma-factor";
 
 import ReactDOM from "react-dom";
 import React from "react";
-- 
GitLab