index.js 8.97 KB
Newer Older
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
1
import React, {Component} from "react";
2 3 4 5 6 7 8 9 10 11
import {
  StyleSheet,
  Text,
  View,
  Image,
  TextInput,
  TouchableOpacity,
  Slider,
  Switch,
} from "react-native";
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
12

13
import { Surface } from "gl-react-native";
14

15 16 17 18 19 20 21 22 23
import RNFS from "react-native-fs";
import HelloGL from "./HelloGL";
import Saturation from "./Saturation";
import HueRotate from "./HueRotate";
import PieProgress from "./PieProgress";
import OneFingerResponse from "./OneFingerResponse";
import AnimatedHelloGL from "./AnimatedHelloGL";
import {Blur} from "gl-react-blur";
import Button from "./Button";
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

class Demo extends Component {
  render () {
    const { title, children } = this.props;
    return <View>
      <Text style={styles.demoTitle}>{title}</Text>
      <View style={styles.demo}>
        {children}
      </View>
    </View>;
  }
}

class Demos extends Component {
  render () {
    const { children, onChange, value } = this.props;
    return <View>
      <View style={styles.nav}>
        {React.Children.map(children, (demo, i) =>
43
          <Text
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
44
            style={{ flex: 1, padding: 10 }}
45 46 47 48 49
            textStyle={{
              textAlign: "center",
              color: i!==value ? "#123" : "#69c",
              fontWeight: "bold"
            }}
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
50
            onPress={() => onChange(i)}>
51 52
            {""+(i+1)}
          </Text>)}
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
53 54 55 56 57 58 59 60 61
      </View>
      <View style={styles.demos}>
        {children[value]}
      </View>
  </View>;
  }
}

class Simple extends Component {
62

63 64 65 66 67 68 69 70 71 72 73 74 75
  state = {
    current: 0,
    saturationFactor: 1,
    hue: 0,
    progress: 0,
    factor: 0,
    text: "and I will return leading the pack",
    switch1: false,
    switch2: false,
    switch3: false,
    captured: null,
    captureConfig: null
  };
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
76

77 78

  onCapture1 = () => {
79 80 81 82 83 84 85 86 87 88 89
    const captureConfig = {
      quality: Math.round((Math.random() * 100))/100,
      type: Math.random() < 0.5 ? "jpg": "png",
      format: Math.random() < 0.5 ? "base64" : "file"
    };
    if (captureConfig.format === "file") {
      captureConfig.filePath = RNFS.DocumentDirectoryPath+"/hellogl_capture.png";
    }
    this.refs.helloGL
    .captureFrame(captureConfig)
    .then(captured => this.setState({ captured, captureConfig }));
90
  };
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
91 92 93 94 95 96 97 98 99 100 101 102

  render () {
    const {
      current,
      saturationFactor,
      hue,
      text,
      progress,
      factor,
      switch1,
      switch2,
      switch3,
103 104
      captured,
      captureConfig
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
105 106 107 108 109
    } = this.state;

    return <View style={styles.container}>

      <Demos onChange={current => this.setState({ current })} value={current}>
110
        <Demo id={1} title="1. Hello GL">
111 112 113
          <Surface width={256} height={171} ref="helloGL">
            <HelloGL />
          </Surface>
114 115 116 117
          <View style={{ marginTop: 20, flexDirection: "row" }}>
            <Button onPress={this.onCapture1}>
              captureFrame()
            </Button>
118 119 120 121
            {captured &&
              <Image source={{ uri: captured }}
                style={{ marginLeft: 20, width: 51, height: 34 }}
              /> }
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
122
          </View>
123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
          {captureConfig &&
            <View style={{ paddingTop: 20, alignItems: "center", flexDirection: "row", justifyContent: "space-between" }}>
              <Text style={{ fontSize: 10 }}>
                format={captureConfig.format}
              </Text>
              <Text style={{ fontSize: 10 }}>
                type={captureConfig.type}
              </Text>
              <Text style={{ fontSize: 10 }}>
                quality={captureConfig.quality+""}
              </Text>
            </View>
          }
          {captured &&
            <Text numberOfLines={1} style={{ marginTop: 10, fontSize: 10, color: "#aaa" }}>
              {captured.slice(0, 100)}
            </Text> }
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
140 141
        </Demo>

142
        <Demo id={2} title="2. Saturate an Image">
143 144
          <Surface width={256} height={171}>
            <Saturation
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
145 146 147
              factor={saturationFactor}
              image={{ uri: "http://i.imgur.com/iPKTONG.jpg" }}
            />
148
          </Surface>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
149
          <Slider
150 151
            maximumValue={8}
            onValueChange ={saturationFactor => this.setState({ saturationFactor })}
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
152 153 154 155
          />
        </Demo>

        <Demo id={3} current={current} title="3. Hue Rotate on Text+Image">
156 157
          <Surface autoRedraw width={256} height={180}>
            <HueRotate hue={hue}>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
158 159 160 161 162
              <View key="hue" style={{ width: 256, height: 180 }}>
                <Image style={{ width: 256, height: 244 }} source={{ uri: "http://i.imgur.com/qVxHrkY.jpg" }}/>
                <Text style={styles.demoText1}>Throw me to the wolves</Text>
                <Text style={styles.demoText2}>{text}</Text>
              </View>
163 164
            </HueRotate>
          </Surface>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
165
          <Slider
166 167
            maximumValue={2 * Math.PI}
            onValueChange={hue => this.setState({ hue })}
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
168 169 170 171 172 173 174 175 176 177
          />
          <TextInput
            style={{ height: 40, borderColor: "#aaa", borderWidth: 1 }}
            onChangeText={text => this.setState({ text })}
            value={text}
          />
        </Demo>

        <Demo id={4} current={current} title="4. Progress Indicator">
          <View style={{ position: "relative", width: 256, height: 180 }}>
178 179 180 181 182 183 184 185 186 187 188 189
            <TouchableOpacity>
              <Image source={{ uri: "http://i.imgur.com/qM9BHCy.jpg" }}
                style={{
                  width: 256,
                  height: 180,
                  position: "absolute",
                  top: 0,
                  left: 0
                }}
              />
            </TouchableOpacity>
            <View pointerEvents="box-none" style={{ position: "absolute", top: 0, left: 0, backgroundColor: "transparent" }}>
190
              <Surface width={256} height={180} backgroundColor="transparent" eventsThrough>
191
                <PieProgress progress={progress} />
192
              </Surface>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
193 194 195
            </View>
          </View>
          <Slider
196 197
            maximumValue={1}
            onValueChange={progress => this.setState({ progress })}
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214
          />
        </Demo>

        <Demo id={5} current={current} title="5. Touch Responsive">
          <OneFingerResponse
            width={256}
            height={180}
          />
        </Demo>

        <Demo id={6} current={current} title="6. Animation">
          <AnimatedHelloGL
            width={256}
            height={180}
          />
        </Demo>

215
        <Demo id={7} current={current} title="7. Blur">
216
          <Surface preload width={256} height={180}>
217
            <Blur factor={factor * 2} passes={4}>
218 219 220
              http://i.imgur.com/3On9QEu.jpg
            </Blur>
          </Surface>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
221
          <Slider
222 223
            maximumValue={2}
            onValueChange={factor => this.setState({ factor })} />
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
224 225 226
        </Demo>

        <Demo id={8} current={current} title="8. Blur+Hue over UI">
227
          <Surface
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
228 229 230 231 232
            width={256}
            height={160}
            autoRedraw
            eventsThrough
            visibleContent>
233
            <HueRotate hue={-switch1 + 2 * switch2 + 4 * switch3}>
234
              <Blur factor={factor}>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
235
                <View key="blur" style={{ width: 256, height: 160, padding: 10, backgroundColor: "#f9f9f9" }}>
236 237
                  <Slider
                    style={{ height: 80 }}
238 239
                    maximumValue={1}
                    onValueChange={factor => this.setState({ factor })}
240 241
                  />
                <View style={{ height: 60, flexDirection: "row", alignItems: "center" }}>
242 243 244
                  <Switch style={{flex:1}} value={switch1} onValueChange={(switch1) => this.setState({ switch1 })} />
                  <Switch style={{flex:1}} value={switch2} onValueChange={(switch2) => this.setState({ switch2 })} />
                  <Switch style={{flex:1}} value={switch3} onValueChange={(switch3) => this.setState({ switch3 })} />
245 246
                </View>
                </View>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
247
              </Blur>
248 249
            </HueRotate>
          </Surface>
250
          <Text>Note: This is highly experimental and not yet performant enough.</Text>
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265
        </Demo>

        <Demo id={9} current={current} title="9. Texture from array">
          <Text>Not Supported Yet</Text>
        </Demo>

      </Demos>
    </View>;
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: "#F9F9F9",
266
    paddingTop: 50,
Gaëtan Renaudeau's avatar
Gaëtan Renaudeau committed
267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317
  },
  nav: {
    flexDirection: "row",
    marginBottom: 20
  },
  demos: {
    flex: 1,
    justifyContent: "center",
    marginLeft: 40,
    width: 276,
    marginBottom: 40,
  },
  demoTitle: {
    marginBottom: 16,
    fontStyle: "italic",
    alignSelf: "flex-start",
    color: "#999",
    fontWeight: "300",
    fontSize: 20,
  },
  demo: {
    marginBottom: 64,
    marginLeft: 20,
  },
  demoText1: {
    position: "absolute",
    top: 0,
    left: 0,
    width: 256,
    textAlign: "center",
    color: "#f16",
    backgroundColor: "transparent",
    fontWeight: "400",
    fontSize: 24,
    letterSpacing: 0
  },
  demoText2: {
    position: "absolute",
    bottom: 4,
    left: 0,
    width: 256,
    textAlign: "center",
    color: "#7bf",
    backgroundColor: "transparent",
    fontWeight: "300",
    fontSize: 32,
    letterSpacing: -1
  },
});

module.exports = Simple;