├── src ├── web-paint │ ├── src │ │ ├── EventBus.ts │ │ ├── interfaces │ │ │ ├── IPoint.ts │ │ │ ├── PenType.ts │ │ │ └── IDrawCommand.ts │ │ ├── MouseState.ts │ │ ├── App.style.ts │ │ ├── components │ │ │ ├── Toolbar.style.ts │ │ │ ├── DecimalSlider.tsx │ │ │ ├── Toolbar.tsx │ │ │ └── Canvas.tsx │ │ ├── index.tsx │ │ ├── index.ejs │ │ ├── store │ │ │ └── index.ts │ │ └── App.tsx │ ├── assets │ │ └── logo.png │ ├── tslint.json │ ├── tsconfig.json │ ├── build │ │ ├── webpack.prod.conf.js │ │ ├── webpack.dev.conf.js │ │ └── webpack.base.conf.js │ └── package.json ├── SoftwareRenderer │ ├── SoftwareRenderer │ │ ├── Libs │ │ │ └── FadeJson.dll │ │ ├── Surface.cs │ │ ├── Camera.cs │ │ ├── App.config │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── GraphicsBuffer.cs │ │ ├── Mesh.cs │ │ ├── app.manifest │ │ ├── AppDelegate.cs │ │ ├── Vector.cs │ │ ├── SoftwareRenderer.csproj │ │ ├── GraphicsDevice.cs │ │ ├── Matrix.cs │ │ └── Contents │ │ │ └── monkey.babylon │ └── SoftwareRenderer.sln ├── mod-manager │ ├── config.py │ ├── mm.spec │ ├── mm.py │ ├── utils.py │ ├── push_mods.py │ └── pull_mods.py ├── BrainfuckInterpreter │ ├── BrainfuckInterpreter │ │ ├── App.config │ │ ├── Program.cs │ │ ├── Properties │ │ │ └── AssemblyInfo.cs │ │ ├── Interpreter.cs │ │ └── BrainfuckInterpreter.csproj │ ├── BrainfuckInterpreter.sln │ ├── .gitattributes │ └── .gitignore └── knn-hanwriting-digit-in-60-line │ └── recognizer.py ├── README.md ├── .gitattributes └── .gitignore /src/web-paint/src/EventBus.ts: -------------------------------------------------------------------------------- 1 | import Vue from "vue"; 2 | 3 | export default new Vue(); 4 | -------------------------------------------------------------------------------- /src/web-paint/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fanyang89/ToysFactory/HEAD/src/web-paint/assets/logo.png -------------------------------------------------------------------------------- /src/web-paint/src/interfaces/IPoint.ts: -------------------------------------------------------------------------------- 1 | interface IPoint { 2 | x: number; 3 | y: number; 4 | } 5 | 6 | export default IPoint; 7 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Libs/FadeJson.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/fanyang89/ToysFactory/HEAD/src/SoftwareRenderer/SoftwareRenderer/Libs/FadeJson.dll -------------------------------------------------------------------------------- /src/web-paint/src/MouseState.ts: -------------------------------------------------------------------------------- 1 | enum MouseState { 2 | OutsideCanvas, 3 | InsideCanvasMouseUp, 4 | InsideCanvasMouseDown, 5 | } 6 | 7 | export default MouseState; 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Toys Factory 2 | 3 | ## Toy List 4 | 5 | * Software Renderer 6 | * web-paint(like mspaint) 7 | * 60 行手写 kNN 识别手写数字 8 | * 随手写的Minecraft mod同步 9 | 10 | ## License 11 | 12 | MIT License 13 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Surface.cs: -------------------------------------------------------------------------------- 1 | namespace SoftwareRenderer 2 | { 3 | public struct Surface 4 | { 5 | public int A; 6 | public int B; 7 | public int C; 8 | } 9 | } -------------------------------------------------------------------------------- /src/web-paint/src/interfaces/PenType.ts: -------------------------------------------------------------------------------- 1 | enum PenType { 2 | Line = "line", 3 | Lines = "lines", 4 | Point = "point", 5 | Circle = "circle", 6 | Rect = "rect", 7 | } 8 | 9 | export default PenType; 10 | -------------------------------------------------------------------------------- /src/mod-manager/config.py: -------------------------------------------------------------------------------- 1 | import utils 2 | 3 | access_key = '' 4 | secret_key = '' 5 | base_uri = '' 6 | bucket_name = '' 7 | tmp_dir = './.tmp' 8 | is_push_allowed = False 9 | mod_dir = utils.search_mod_dir() 10 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Camera.cs: -------------------------------------------------------------------------------- 1 | namespace SoftwareRenderer 2 | { 3 | public class Camera 4 | { 5 | public Vector Position { get; set; } 6 | public Vector Target { get; set; } 7 | } 8 | } -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/BrainfuckInterpreter/App.config: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /src/web-paint/src/App.style.ts: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | 3 | const style: React.CSSProperties = { 4 | logo: { 5 | height: "31px", 6 | borderRadius: "6px", 7 | margin: "16px 24px 16px 0", 8 | float: "left", 9 | }, 10 | }; 11 | 12 | export default style; 13 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Program.cs: -------------------------------------------------------------------------------- 1 | namespace SoftwareRenderer 2 | { 3 | internal static class Program 4 | { 5 | private static void Main(string[] args) { 6 | using (var app = new AppDelegate()) { 7 | app.Run(); 8 | } 9 | } 10 | } 11 | } -------------------------------------------------------------------------------- /src/web-paint/src/components/Toolbar.style.ts: -------------------------------------------------------------------------------- 1 | import * as React from "react"; 2 | 3 | interface IToolbarStyle { 4 | buttonGroup: React.CSSProperties; 5 | } 6 | 7 | const style: IToolbarStyle = { 8 | buttonGroup: { 9 | marginLeft: "8px", 10 | marginRight: "8px", 11 | }, 12 | }; 13 | 14 | export default style; 15 | -------------------------------------------------------------------------------- /src/web-paint/tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "defaultSeverity": "error", 3 | "extends": ["tslint:recommended"], 4 | "jsRules": {}, 5 | "rules": { 6 | "object-literal-key-quotes": [true, "as-needed"], 7 | "arrow-parens": [true, "ban-single-arg-parens"], 8 | "no-empty": false 9 | }, 10 | "rulesDirectory": [] 11 | } 12 | -------------------------------------------------------------------------------- /src/web-paint/src/index.tsx: -------------------------------------------------------------------------------- 1 | import "antd/dist/antd.min.css"; 2 | import * as React from "react"; 3 | import * as ReactDOM from "react-dom"; 4 | import App from "./App"; 5 | import Store from "./store"; 6 | 7 | const store = new Store(); 8 | const app = ; 9 | 10 | ReactDOM.render(app, document.getElementById("app") as HTMLElement); 11 | -------------------------------------------------------------------------------- /src/web-paint/src/interfaces/IDrawCommand.ts: -------------------------------------------------------------------------------- 1 | import { Color } from "react-color"; 2 | import IPoint from "../interfaces/IPoint"; 3 | import PenType from "../interfaces/PenType"; 4 | 5 | interface IDrawCommand { 6 | type: PenType; 7 | path: IPoint[]; 8 | lineWidth: number; 9 | lineColor: string; 10 | fillColor: string; 11 | } 12 | 13 | export default IDrawCommand; 14 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/BrainfuckInterpreter/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace BrainfuckInterpreter 4 | { 5 | internal static class Program 6 | { 7 | private static void Main(string[] args) 8 | { 9 | Console.WriteLine("Brainfuck Intepreter. Written by fuis. 2016-12-2"); 10 | var interpreter = new Interpreter(); 11 | while (true) 12 | { 13 | Console.Write("$ "); 14 | interpreter.Execute(Console.ReadLine()); 15 | } 16 | } 17 | } 18 | } -------------------------------------------------------------------------------- /src/web-paint/src/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <%= htmlWebpackPlugin.options.title %> 10 | 11 | 12 | 13 | 14 |
15 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /src/web-paint/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "outDir": "build/dist", 4 | "module": "commonjs", 5 | "target": "es5", 6 | "lib": ["es6", "dom", "es2016", "es2017", "esnext"], 7 | "sourceMap": true, 8 | "allowJs": false, 9 | "jsx": "react", 10 | "moduleResolution": "node", 11 | "rootDir": "src", 12 | "noImplicitReturns": true, 13 | "noImplicitThis": true, 14 | "noImplicitAny": true, 15 | "strictNullChecks": true, 16 | "experimentalDecorators": true, 17 | "allowSyntheticDefaultImports": true 18 | }, 19 | "exclude": ["node_modules", "**/*.spec.ts", "build", "dist"], 20 | "include": ["src/**/*"] 21 | } 22 | -------------------------------------------------------------------------------- /src/web-paint/src/store/index.ts: -------------------------------------------------------------------------------- 1 | import { observable } from "mobx"; 2 | import { Color } from "react-color"; 3 | import IDrawCommand from "../interfaces/IDrawCommand"; 4 | import PenType from "../interfaces/PenType"; 5 | import MouseState from "../MouseState"; 6 | 7 | class Store { 8 | @observable public drawCommands: IDrawCommand[] = []; 9 | @observable public mouseState: MouseState; 10 | @observable public drawType: PenType = PenType.Lines; 11 | @observable public lineWidth: number = 3; 12 | @observable public lineColor: string = "red"; 13 | @observable public fillColor: string = "#000"; 14 | @observable public isFileNameDialogShow = false; 15 | @observable public fileName: string; 16 | } 17 | 18 | export default Store; 19 | -------------------------------------------------------------------------------- /src/web-paint/build/webpack.prod.conf.js: -------------------------------------------------------------------------------- 1 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 2 | const webpack = require("webpack"); 3 | const baseConfig = require("./webpack.base.conf"); 4 | 5 | var prodConfig = Object.assign({}, baseConfig); 6 | 7 | prodConfig.devtool = ""; 8 | 9 | prodConfig.plugins = [ 10 | new webpack.DefinePlugin({ 11 | "process.env": { 12 | NODE_ENV: JSON.stringify("production"), 13 | }, 14 | }), 15 | new webpack.optimize.CommonsChunkPlugin({ 16 | name: "vendor", 17 | minChunks: ({ resource }) => 18 | resource && 19 | resource.indexOf("node_modules") >= 0 && 20 | resource.match(/\.js$/), 21 | }), 22 | new HtmlWebpackPlugin({ 23 | template: "./src/index.ejs", 24 | title: "WebPaint", 25 | }), 26 | new webpack.optimize.UglifyJsPlugin(), 27 | new webpack.optimize.AggressiveMergingPlugin(), 28 | ]; 29 | 30 | module.exports = prodConfig; 31 | -------------------------------------------------------------------------------- /src/mod-manager/mm.spec: -------------------------------------------------------------------------------- 1 | # -*- mode: python -*- 2 | 3 | block_cipher = None 4 | 5 | 6 | a = Analysis(['mm.py'], 7 | pathex=['D:\\Workspace\\great-fire-world\\mod-manager'], 8 | binaries=[], 9 | datas=[], 10 | hiddenimports=[], 11 | hookspath=[], 12 | runtime_hooks=[], 13 | excludes=[], 14 | win_no_prefer_redirects=False, 15 | win_private_assemblies=False, 16 | cipher=block_cipher) 17 | pyz = PYZ(a.pure, a.zipped_data, 18 | cipher=block_cipher) 19 | exe = EXE(pyz, 20 | a.scripts, 21 | exclude_binaries=True, 22 | name='mm', 23 | debug=False, 24 | strip=False, 25 | upx=True, 26 | console=True ) 27 | coll = COLLECT(exe, 28 | a.binaries, 29 | a.zipfiles, 30 | a.datas, 31 | strip=False, 32 | upx=True, 33 | name='mm') 34 | -------------------------------------------------------------------------------- /src/web-paint/build/webpack.dev.conf.js: -------------------------------------------------------------------------------- 1 | const baseConfig = require("./webpack.base.conf"); 2 | const webpack = require("webpack"); 3 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 4 | const path = require("path"); 5 | 6 | var devConfig = Object.assign({}, baseConfig); 7 | 8 | devConfig.devServer = { 9 | compress: true, 10 | port: 9000, 11 | hot: true, 12 | lazy: false, 13 | noInfo: true, 14 | overlay: true, 15 | open: true, 16 | }; 17 | 18 | devConfig.plugins = [ 19 | new webpack.DefinePlugin({ 20 | "process.env": { 21 | NODE_ENV: JSON.stringify("development"), 22 | }, 23 | }), 24 | new webpack.HotModuleReplacementPlugin(), 25 | new webpack.optimize.CommonsChunkPlugin({ 26 | name: "vendor", 27 | minChunks: ({ resource }) => 28 | resource && 29 | resource.indexOf("node_modules") >= 0 && 30 | resource.match(/\.js$/), 31 | }), 32 | new HtmlWebpackPlugin({ 33 | template: "./src/index.ejs", 34 | title: "WebPaint", 35 | }), 36 | ]; 37 | 38 | module.exports = devConfig; 39 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 14 4 | VisualStudioVersion = 14.0.24720.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SoftwareRenderer", "SoftwareRenderer\SoftwareRenderer.csproj", "{2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.InteropServices; 3 | 4 | // 有关程序集的一般信息由以下 5 | // 控制。更改这些特性值可修改 6 | // 与程序集关联的信息。 7 | [assembly: AssemblyTitle("SoftwareRenderer")] 8 | [assembly: AssemblyDescription("")] 9 | [assembly: AssemblyConfiguration("")] 10 | [assembly: AssemblyCompany("")] 11 | [assembly: AssemblyProduct("SoftwareRenderer")] 12 | [assembly: AssemblyCopyright("Copyright © 2016")] 13 | [assembly: AssemblyTrademark("")] 14 | [assembly: AssemblyCulture("")] 15 | 16 | //将 ComVisible 设置为 false 将使此程序集中的类型 17 | //对 COM 组件不可见。 如果需要从 COM 访问此程序集中的类型, 18 | //请将此类型的 ComVisible 特性设置为 true。 19 | [assembly: ComVisible(false)] 20 | 21 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 22 | [assembly: Guid("2a47d0e8-32c8-4bc3-9c1f-a74d690be7e7")] 23 | 24 | // 程序集的版本信息由下列四个值组成: 25 | // 26 | // 主版本 27 | // 次版本 28 | // 生成号 29 | // 修订号 30 | // 31 | //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值, 32 | // 方法是按如下所示使用“*”: : 33 | // [assembly: AssemblyVersion("1.0.*")] 34 | [assembly: AssemblyVersion("1.0.0.0")] 35 | [assembly: AssemblyFileVersion("1.0.0.0")] -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/BrainfuckInterpreter.sln: -------------------------------------------------------------------------------- 1 | 2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.25914.0 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BrainfuckInterpreter", "BrainfuckInterpreter\BrainfuckInterpreter.csproj", "{71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | EndGlobal 23 | -------------------------------------------------------------------------------- /src/mod-manager/mm.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import config 4 | from push_mods import push 5 | from pull_mods import pull 6 | 7 | 8 | def help(): 9 | print('eg. Type "mm pull" or "mm" to sync with remote.') 10 | print('eg. Type "mm push" push mods to remote.') 11 | 12 | 13 | def main(): 14 | # 创建临时文件夹 15 | if not os.path.isdir(config.tmp_dir): 16 | os.mkdir(config.tmp_dir) 17 | 18 | if len(sys.argv) == 1: 19 | pull() 20 | return 21 | 22 | if len(sys.argv) >= 2: 23 | help() 24 | return 25 | 26 | cmd = sys.argv[1] 27 | if cmd == 'push': 28 | if not config.is_push_allowed: 29 | print("You don't have permission to push") 30 | return 31 | else: 32 | push() 33 | print('Done.') 34 | return 35 | elif cmd == 'help': 36 | help() 37 | return 38 | elif cmd == 'pull': 39 | pull() 40 | return 41 | else: 42 | print('Unknown command line arguments.') 43 | help() 44 | return 45 | 46 | 47 | if __name__ == '__main__': 48 | main() 49 | -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/BrainfuckInterpreter/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // 有关程序集的一般信息由以下 6 | // 控制。更改这些特性值可修改 7 | // 与程序集关联的信息。 8 | [assembly: AssemblyTitle("BrainfuckInterpreter")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("BrainfuckInterpreter")] 13 | [assembly: AssemblyCopyright("Copyright © 2016")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // 将 ComVisible 设置为 false 会使此程序集中的类型 18 | //对 COM 组件不可见。如果需要从 COM 访问此程序集中的类型 19 | //请将此类型的 ComVisible 特性设置为 true。 20 | [assembly: ComVisible(false)] 21 | 22 | // 如果此项目向 COM 公开,则下列 GUID 用于类型库的 ID 23 | [assembly: Guid("71b8010b-4d2b-4a32-9ecc-d6c9d9f95c33")] 24 | 25 | // 程序集的版本信息由下列四个值组成: 26 | // 27 | // 主版本 28 | // 次版本 29 | // 生成号 30 | // 修订号 31 | // 32 | // 可以指定所有值,也可以使用“生成号”和“修订号”的默认值 33 | // 方法是按如下所示使用“*”: : 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/GraphicsBuffer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | 4 | namespace SoftwareRenderer 5 | { 6 | public class GraphicsBuffer : IDisposable 7 | { 8 | public GraphicsBuffer(int width, int height, Camera camera) { 9 | Current = new Bitmap(width, height); 10 | CurrentGraphicsDevice = new GraphicsDevice(Current, camera); 11 | Background = new Bitmap(width, height); 12 | BackgroundGraphicsDevice = new GraphicsDevice(Background, camera); 13 | } 14 | 15 | public Bitmap Background { get; private set; } 16 | public GraphicsDevice BackgroundGraphicsDevice { get; private set; } 17 | public Bitmap Current { get; private set; } 18 | public GraphicsDevice CurrentGraphicsDevice { get; private set; } 19 | 20 | public void SwapBuffers() { 21 | var t = Current; 22 | Current = Background; 23 | Background = t; 24 | } 25 | 26 | public void Dispose() { 27 | CurrentGraphicsDevice.Dispose(); 28 | Current.Dispose(); 29 | BackgroundGraphicsDevice.Dispose(); 30 | Background.Dispose(); 31 | } 32 | } 33 | } -------------------------------------------------------------------------------- /src/web-paint/src/components/DecimalSlider.tsx: -------------------------------------------------------------------------------- 1 | import { Col, InputNumber, Row, Slider } from "antd"; 2 | import * as React from "react"; 3 | 4 | interface IDecimalSliderProps { 5 | onChange?: (value: number) => void; 6 | value: number; 7 | } 8 | 9 | class DecimalSlider extends React.Component { 10 | public constructor(props: IDecimalSliderProps) { 11 | super(props); 12 | } 13 | 14 | public onChange(value: any) { 15 | this.setState({ value }); 16 | if (this.props.onChange) { 17 | this.props.onChange(value); 18 | } 19 | } 20 | 21 | public render() { 22 | return ( 23 | 24 | 25 | this.onChange(e)} 29 | value={this.props.value} 30 | step={0.01} 31 | /> 32 | 33 | 34 | this.onChange(e)} 41 | /> 42 | 43 | 44 | ); 45 | } 46 | } 47 | 48 | export default DecimalSlider; 49 | -------------------------------------------------------------------------------- /src/mod-manager/utils.py: -------------------------------------------------------------------------------- 1 | import os 2 | import qiniu 3 | import config 4 | import requests 5 | import json 6 | import glob 7 | 8 | 9 | def search_mod_dir(): 10 | possible_dirs = [ 11 | './../.minecraft/mods', 12 | './../../.minecraft/mods', 13 | './.minecraft/mods' 14 | ] 15 | results = [dir for dir in possible_dirs if os.path.isdir(dir)] 16 | if not results: 17 | raise Exception('Minecraft mod dir not found.') 18 | if len(results) > 1: 19 | raise Exception('More than one Minecraft mod dir found.') 20 | return os.path.abspath(results[0]) 21 | 22 | 23 | def get_local_mods(): 24 | postfixes = ['*.jar', '*.litemod'] 25 | patterns = [os.path.join(config.mod_dir, it) for it in postfixes] 26 | mod_abspath_list = sum([glob.glob(it, recursive=False) 27 | for it in patterns], []) 28 | return set([os.path.basename(it) for it in mod_abspath_list]) 29 | 30 | 31 | def get_remote_mods(): 32 | q = qiniu.Auth(config.access_key, config.secret_key) 33 | info_url = 'http://{}/{}'.format(config.base_uri, 'index.json') 34 | private_url = q.private_download_url(info_url) 35 | response = requests.get(private_url) 36 | assert response.status_code == 200 37 | if response.status_code != 200: 38 | raise Exception('Failed to get remote mod list.') 39 | return set(json.loads(response.text)) 40 | -------------------------------------------------------------------------------- /src/web-paint/build/webpack.base.conf.js: -------------------------------------------------------------------------------- 1 | const webpack = require("webpack"); 2 | const path = require("path"); 3 | const HtmlWebpackPlugin = require("html-webpack-plugin"); 4 | 5 | const workspaceRoot = path.resolve(path.join(__dirname, "../")); 6 | 7 | module.exports = { 8 | resolve: { 9 | extensions: [".ts", ".tsx", ".js", ".jsx", ".css", ".less"], 10 | alias: { 11 | "@": path.join(workspaceRoot, "src"), 12 | }, 13 | }, 14 | devtool: "cheap-module-eval-source-map", 15 | entry: path.join(workspaceRoot, "src/index.tsx"), 16 | output: { 17 | path: path.resolve(workspaceRoot, "dist"), 18 | filename: "[name].js", 19 | libraryTarget: "umd", 20 | }, 21 | module: { 22 | loaders: [ 23 | { 24 | test: /\.css$/, 25 | loader: "style-loader!css-loader", 26 | }, 27 | { 28 | test: /\.less$/, 29 | loader: "style-loader!css-loader!less-loader", 30 | }, 31 | { 32 | test: /\.tsx?$/, 33 | loader: "ts-loader", 34 | }, 35 | { 36 | test: /\.(png|svg|jpg|gif)$/, 37 | loader: "file-loader", 38 | options: { 39 | name: "[name].[ext]", 40 | outputPath: "assets/", 41 | }, 42 | }, 43 | { 44 | test: /\.(woff|woff2|eot|ttf|otf)$/, 45 | loader: "file-loader", 46 | options: { 47 | name: "[name].[ext]", 48 | outputPath: "assets/", 49 | }, 50 | }, 51 | ], 52 | }, 53 | }; 54 | -------------------------------------------------------------------------------- /src/mod-manager/push_mods.py: -------------------------------------------------------------------------------- 1 | import qiniu 2 | import os 3 | import config 4 | import progressbar 5 | import utils 6 | import json 7 | 8 | 9 | def push(): 10 | local_mods = utils.get_local_mods() 11 | remote_mods = utils.get_remote_mods() 12 | intersection = remote_mods & local_mods 13 | 14 | push_list = local_mods - intersection 15 | remove_list = remote_mods - intersection 16 | 17 | if not remove_list and not push_list: 18 | print('Nothing changed.') 19 | return 20 | 21 | q = qiniu.Auth(config.access_key, config.secret_key) 22 | bucket = qiniu.BucketManager(q) 23 | 24 | # 删除mod 25 | if not remove_list: 26 | print('Removing mods at remote.') 27 | bar = progressbar.ProgressBar() 28 | for mod_name in bar(remove_list): 29 | ret, info = bucket.delete(config.bucket_name, mod_name) 30 | 31 | # 上传mod 32 | print('Pushing mods to remote.') 33 | bar = progressbar.ProgressBar() 34 | for mod_name in bar(push_list): 35 | token = q.upload_token(config.bucket_name, mod_name) 36 | abspath = os.path.join(config.mod_dir, mod_name) 37 | ret, info = qiniu.put_file(token, mod_name, abspath) 38 | assert ret['hash'] == qiniu.etag(abspath) 39 | 40 | # 更新mod列表 41 | print('Updating mod index.') 42 | index_filename = 'index.json' 43 | index_path = os.path.join(config.tmp_dir, index_filename) 44 | with open(index_path, 'w') as fp: 45 | json.dump(list(local_mods), fp) 46 | token = q.upload_token(config.bucket_name, index_filename) 47 | ret, info = qiniu.put_file(token, index_filename, index_path) 48 | -------------------------------------------------------------------------------- /src/web-paint/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web-paint", 3 | "version": "1.0.0", 4 | "description": "web-paint", 5 | "main": "index.js", 6 | "repository": { 7 | "git": null 8 | }, 9 | "scripts": { 10 | "dev": "webpack-dev-server --config build/webpack.dev.conf.js", 11 | "dev:build": "webpack --config build/webpack.dev.conf.js", 12 | "build": "webpack --config build/webpack.prod.conf.js" 13 | }, 14 | "author": "YangFan789 ", 15 | "license": "MIT", 16 | "dependencies": { 17 | "@types/file-saver": "^1.3.0", 18 | "@types/radium": "^0.18.23", 19 | "@types/react": "^15.6.1", 20 | "@types/react-color": "^2.13.3", 21 | "@types/react-dom": "^15.5.1", 22 | "@types/webpack": "^3.8.1", 23 | "antd": "^2.13.10", 24 | "file-saver": "^1.3.3", 25 | "jquery": "^3.2.1", 26 | "lodash": "^4.17.4", 27 | "mobx": "^3.3.1", 28 | "mobx-react": "^4.3.4", 29 | "ngprogress": "^1.1.1", 30 | "radium": "^0.19.6", 31 | "react": "^15.6.1", 32 | "react-color": "^2.13.8", 33 | "react-dom": "^15.5.1", 34 | "react-router": "^4.2.0", 35 | "vue": "^2.5.3" 36 | }, 37 | "devDependencies": { 38 | "css-loader": "^0.28.7", 39 | "file-loader": "^1.1.5", 40 | "html-webpack-plugin": "^2.30.1", 41 | "less": "^2.7.3", 42 | "less-loader": "^4.0.5", 43 | "path": "^0.12.7", 44 | "style-loader": "^0.19.0", 45 | "ts-lint": "^4.5.1", 46 | "ts-loader": "^3.1.1", 47 | "typescript": "^2.6.1", 48 | "uglifyjs-webpack-plugin": "^1.0.1", 49 | "url-loader": "^0.6.2", 50 | "webpack": "^3.8.1", 51 | "webpack-dev-server": "^2.9.4" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /src/knn-hanwriting-digit-in-60-line/recognizer.py: -------------------------------------------------------------------------------- 1 | import os 2 | 3 | train_data = [[] for i in range(10)] 4 | 5 | 6 | def matrix_from_file(path): 7 | matrix = [([0] * 32) for i in range(32)] 8 | with open(path, 'r') as f: 9 | lines = f.readlines() 10 | for i in range(32): 11 | for j in range(32): 12 | matrix[i][j] = int(lines[i][j]) 13 | return matrix 14 | 15 | 16 | def init_train_data(): 17 | train_data_folder = 'data/train/' 18 | train_file_path = os.listdir(train_data_folder) 19 | for path in train_file_path: 20 | digit = int(path[0]) 21 | matrix = matrix_from_file(train_data_folder + path) 22 | train_data[digit].append(matrix) 23 | 24 | 25 | def matrix_distance(A, B): 26 | sum = 0.0 27 | for i in range(32): 28 | for j in range(32): 29 | sum += (A[i][j] - B[i][j]) ** 2 30 | 31 | return sum ** 0.5 32 | 33 | 34 | def classify(X, k): 35 | result = [[str(x), 0.0] for x in range(10)] 36 | for i in range(10): 37 | for Y in train_data[i]: 38 | result[i][1] += matrix_distance(X, Y) 39 | result.sort(key=lambda r: r[1]) 40 | return result[0:k] 41 | 42 | 43 | def test(): 44 | test_file_path = os.listdir('data/test/') 45 | total = len(test_file_path) 46 | c = 0 47 | for p in test_file_path: 48 | X = matrix_from_file('data/test/' + p) 49 | result = classify(X, 1) 50 | correct_result = p[0] 51 | if str(correct_result) == result[0][0]: 52 | c += 1 53 | print "Correct %d/%d" % (c, total) 54 | 55 | 56 | if __name__ == "__main__": 57 | init_train_data() 58 | test() 59 | -------------------------------------------------------------------------------- /src/web-paint/src/App.tsx: -------------------------------------------------------------------------------- 1 | import { Breadcrumb, Button, Card, Icon, Layout, Menu } from "antd"; 2 | import { observer } from "mobx-react"; 3 | import * as Radium from "radium"; 4 | import * as React from "react"; 5 | import style from "./App.style"; 6 | import Canvas from "./components/Canvas"; 7 | import Toolbar from "./components/Toolbar"; 8 | import Store from "./store"; 9 | 10 | const { Header, Content, Footer } = Layout; 11 | const ButtonGroup = Button.Group; 12 | 13 | interface IAppProps { 14 | store: Store; 15 | } 16 | 17 | @Radium 18 | @observer 19 | class App extends React.Component { 20 | public render() { 21 | const store = this.props.store; 22 | return ( 23 | 24 |
25 | 26 | WebPaint 27 |
28 | 29 | 30 |
31 | 32 |
40 | 49 |
50 |
51 |
52 |
53 | ); 54 | } 55 | } 56 | 57 | export default App; 58 | -------------------------------------------------------------------------------- /src/mod-manager/pull_mods.py: -------------------------------------------------------------------------------- 1 | import qiniu 2 | import os 3 | import config 4 | import progressbar 5 | import utils 6 | import requests 7 | 8 | 9 | def download_file(url, path, filename): 10 | req = requests.get(url) 11 | with open(os.path.join(path, filename), 'wb') as f: 12 | for chunk in req.iter_content(chunk_size=1024): 13 | if chunk: 14 | f.write(chunk) 15 | return 16 | 17 | 18 | def pull(): 19 | local_mods = utils.get_local_mods() 20 | remote_mods = utils.get_remote_mods() 21 | intersection = remote_mods & local_mods 22 | 23 | pull_list = remote_mods - intersection 24 | remove_list = local_mods - intersection 25 | 26 | if not remove_list and not pull_list: 27 | print('Nothing changed.') 28 | return 29 | 30 | q = qiniu.Auth(config.access_key, config.secret_key) 31 | bucket = qiniu.BucketManager(q) 32 | 33 | # 删除mod 34 | if remove_list: 35 | print('Remove local useless mods.') 36 | bar = progressbar.ProgressBar() 37 | for mod_name in bar(remove_list): 38 | abspath = os.path.join(config.mod_dir, mod_name) 39 | os.remove(abspath) 40 | 41 | # 下载mod 42 | if pull_list: 43 | print('Downloading mods from remote.') 44 | bar = progressbar.ProgressBar() 45 | for mod_name in bar(pull_list): 46 | download_path = os.path.join(config.tmp_dir, mod_name) 47 | base_url = 'http://{}/{}'.format(config.base_uri, mod_name) 48 | private_url = q.private_download_url(base_url) 49 | download_file(private_url, config.tmp_dir, mod_name) 50 | ret, info = bucket.stat(config.bucket_name, mod_name) 51 | assert ret['hash'] == qiniu.etag(download_path) 52 | os.rename(download_path, os.path.join(config.mod_dir, mod_name)) 53 | -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/BrainfuckInterpreter/Interpreter.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace BrainfuckInterpreter 4 | { 5 | internal class Interpreter 6 | { 7 | private readonly char[] _memory; 8 | 9 | public Interpreter(int memorySize = 1000) 10 | { 11 | _memory = new char[memorySize]; 12 | } 13 | 14 | public void Execute(string code) 15 | { 16 | var currentMemoryPosition = 0; 17 | var pos = 0; 18 | while (pos < code.Length) 19 | { 20 | var ins = code[pos]; 21 | switch (ins) 22 | { 23 | case '>': 24 | currentMemoryPosition++; 25 | break; 26 | case '<': 27 | currentMemoryPosition--; 28 | break; 29 | case '+': 30 | _memory[currentMemoryPosition]++; 31 | break; 32 | case '-': 33 | _memory[currentMemoryPosition]--; 34 | break; 35 | case '.': 36 | Console.Write(_memory[currentMemoryPosition]); 37 | break; 38 | case ',': 39 | _memory[currentMemoryPosition] = (char)Console.Read(); 40 | break; 41 | case '[': 42 | if (_memory[currentMemoryPosition] == 0) 43 | { 44 | while (code[pos] != ']') 45 | { 46 | pos++; 47 | } 48 | } 49 | break; 50 | case ']': 51 | if (_memory[currentMemoryPosition] != 0) 52 | { 53 | while (code[pos] != '[') 54 | { 55 | pos--; 56 | } 57 | } 58 | break; 59 | } 60 | pos++; 61 | } 62 | } 63 | } 64 | } -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Mesh.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | using FadeJson; 3 | 4 | namespace SoftwareRenderer 5 | { 6 | public class Mesh 7 | { 8 | //Hide default ctor 9 | private Mesh() { } 10 | 11 | public Vector Position { get; set; } = Vector.Zero; 12 | public Vector Rotation { get; set; } = Vector.Zero; 13 | public Surface[] Surfaces { get; private set; } 14 | public Vector[] Vertices { get; private set; } 15 | 16 | public static Mesh[] FromBabylonModel(string fileName) { 17 | var j = JsonValue.FromFile(fileName); 18 | var meshes = new List(); 19 | 20 | foreach (var jmesh in j["meshes"].Values) { 21 | var mesh = new Mesh(); 22 | 23 | var uvCount = jmesh["uvCount"].ValueOf(); 24 | var verticesStep = new[] { 6, 8, 10 }[uvCount]; 25 | var vertices = new List(); 26 | var verticesArray = jmesh["vertices"]; 27 | var verticesCount = verticesArray.Count / verticesStep; 28 | for (var i = 0; i < verticesCount; i++) { 29 | var x = (float)verticesArray[i * verticesStep].ValueOf(); 30 | var y = (float)verticesArray[i * verticesStep + 1].ValueOf(); 31 | var z = (float)verticesArray[i * verticesStep + 2].ValueOf(); 32 | vertices.Add(new Vector(x, y, z)); 33 | } 34 | mesh.Vertices = vertices.ToArray(); 35 | 36 | var indices = jmesh["indices"]; 37 | var surfaceCount = indices.Count / 3; 38 | var surfaceList = new List(); 39 | for (var i = 0; i < surfaceCount; i++) { 40 | var a = indices[i * 3].ValueOf(); 41 | var b = indices[i * 3 + 1].ValueOf(); 42 | var c = indices[i * 3 + 2].ValueOf(); 43 | surfaceList.Add(new Surface { A = a, B = b, C = c }); 44 | } 45 | mesh.Surfaces = surfaceList.ToArray(); 46 | 47 | var position = jmesh["position"]; 48 | mesh.Position = new Vector( 49 | (float)position[0].ValueOf(), 50 | (float)position[1].ValueOf(), 51 | (float)position[2].ValueOf() 52 | ); 53 | meshes.Add(mesh); 54 | } 55 | return meshes.ToArray(); 56 | } 57 | } 58 | } -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/BrainfuckInterpreter/BrainfuckInterpreter.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {71B8010B-4D2B-4A32-9ECC-D6C9D9F95C33} 8 | Exe 9 | BrainfuckInterpreter 10 | BrainfuckInterpreter 11 | v4.6.2 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/.gitattributes: -------------------------------------------------------------------------------- 1 | ############################################################################### 2 | # Set default behavior to automatically normalize line endings. 3 | ############################################################################### 4 | * text=auto 5 | 6 | ############################################################################### 7 | # Set default behavior for command prompt diff. 8 | # 9 | # This is need for earlier builds of msysgit that does not have it on by 10 | # default for csharp files. 11 | # Note: This is only used by command line 12 | ############################################################################### 13 | #*.cs diff=csharp 14 | 15 | ############################################################################### 16 | # Set the merge driver for project and solution files 17 | # 18 | # Merging from the command prompt will add diff markers to the files if there 19 | # are conflicts (Merging from VS is not affected by the settings below, in VS 20 | # the diff markers are never inserted). Diff markers may cause the following 21 | # file extensions to fail to load in VS. An alternative would be to treat 22 | # these files as binary and thus will always conflict and require user 23 | # intervention with every merge. To do so, just uncomment the entries below 24 | ############################################################################### 25 | #*.sln merge=binary 26 | #*.csproj merge=binary 27 | #*.vbproj merge=binary 28 | #*.vcxproj merge=binary 29 | #*.vcproj merge=binary 30 | #*.dbproj merge=binary 31 | #*.fsproj merge=binary 32 | #*.lsproj merge=binary 33 | #*.wixproj merge=binary 34 | #*.modelproj merge=binary 35 | #*.sqlproj merge=binary 36 | #*.wwaproj merge=binary 37 | 38 | ############################################################################### 39 | # behavior for image files 40 | # 41 | # image files are treated as binary by default. 42 | ############################################################################### 43 | #*.jpg binary 44 | #*.png binary 45 | #*.gif binary 46 | 47 | ############################################################################### 48 | # diff behavior for common document formats 49 | # 50 | # Convert binary document formats to text before diffing them. This feature 51 | # is only available from the command line. Turn it on by uncommenting the 52 | # entries below. 53 | ############################################################################### 54 | #*.doc diff=astextplain 55 | #*.DOC diff=astextplain 56 | #*.docx diff=astextplain 57 | #*.DOCX diff=astextplain 58 | #*.dot diff=astextplain 59 | #*.DOT diff=astextplain 60 | #*.pdf diff=astextplain 61 | #*.PDF diff=astextplain 62 | #*.rtf diff=astextplain 63 | #*.RTF diff=astextplain 64 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/app.manifest: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | 53 | true 54 | 55 | 56 | 57 | 58 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/AppDelegate.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Diagnostics; 3 | using System.Drawing; 4 | using System.Threading; 5 | using System.Windows.Forms; 6 | 7 | namespace SoftwareRenderer 8 | { 9 | public class AppDelegate : IDisposable 10 | { 11 | private const int Height = 768; 12 | private const int MaxFps = 24; 13 | private const int Width = 1024; 14 | private readonly Font defaultFont = new Font(new FontFamily("Microsoft Yahei Mono"), 14); 15 | private readonly TimeSpan maxBreakTime = TimeSpan.FromSeconds(2); 16 | private readonly TimeSpan maxElapsedTime = TimeSpan.FromMilliseconds(1000.0 / MaxFps); 17 | private GraphicsBuffer buffer; 18 | private Camera camera; 19 | private Form form; 20 | private Graphics formGraphics; 21 | private Mesh[] meshes; 22 | 23 | public AppDelegate() { 24 | LoadContent(); 25 | } 26 | 27 | public void Dispose() { 28 | formGraphics.Dispose(); 29 | buffer.Dispose(); 30 | } 31 | 32 | public void Run() { 33 | var stopwatch = new Stopwatch(); 34 | var deltatime = maxElapsedTime; 35 | 36 | form.Show(); 37 | 38 | while (!form.IsDisposed) { 39 | stopwatch.Start(); 40 | 41 | Update(deltatime); 42 | Render(deltatime); 43 | buffer.SwapBuffers(); 44 | Present(); 45 | Application.DoEvents(); 46 | if (stopwatch.Elapsed < maxElapsedTime) { 47 | Thread.Sleep(maxElapsedTime - stopwatch.Elapsed); 48 | } 49 | 50 | stopwatch.Stop(); 51 | deltatime = stopwatch.Elapsed; 52 | if (deltatime > maxBreakTime) { 53 | deltatime = maxElapsedTime; 54 | } 55 | stopwatch.Reset(); 56 | } 57 | } 58 | 59 | private void LoadContent() { 60 | form = new Form { 61 | Size = new Size(Width, Height), 62 | StartPosition = FormStartPosition.CenterScreen 63 | }; 64 | formGraphics = form.CreateGraphics(); 65 | camera = new Camera { Position = new Vector(0, 0, 10), Target = Vector.Zero }; 66 | buffer = new GraphicsBuffer(Width, Height, camera); 67 | meshes = Mesh.FromBabylonModel("Contents/monkey.babylon"); 68 | } 69 | 70 | private void Present() { 71 | formGraphics.DrawImage(buffer.Current, Point.Empty); 72 | } 73 | 74 | private void Render(TimeSpan dt) { 75 | var device = buffer.BackgroundGraphicsDevice; 76 | device.Clear(Color.White); 77 | device.DrawMeshes(meshes, Color.CadetBlue); 78 | device.DrawString($"FPS: {1000.0 / dt.Milliseconds:F2}", defaultFont, Brushes.Black, 0, 0); 79 | } 80 | 81 | private void Update(TimeSpan dt) { 82 | foreach (var mesh in meshes) { 83 | mesh.Rotation += new Vector(0, 0.1f, 0); 84 | } 85 | } 86 | } 87 | } -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Vector.cs: -------------------------------------------------------------------------------- 1 | using System.Drawing; 2 | 3 | namespace SoftwareRenderer 4 | { 5 | public struct Vector 6 | { 7 | public Vector(float x, float y, float z) { 8 | Values = new float[3]; 9 | Values[0] = x; 10 | Values[1] = y; 11 | Values[2] = z; 12 | } 13 | 14 | public Vector(float value) { 15 | Values = new float[3]; 16 | Values[0] = value; 17 | Values[1] = value; 18 | Values[2] = value; 19 | } 20 | 21 | public float Length => 22 | (float)System.Math.Sqrt(Values[0] * Values[0] + Values[1] * Values[1] + Values[2] * Values[2]) 23 | ; 24 | 25 | public static Vector One => new Vector(1); 26 | 27 | public static Vector UnitX => new Vector(1, 0, 0); 28 | 29 | public static Vector UnitY => new Vector(0, 1, 0); 30 | 31 | public static Vector UnitZ => new Vector(0, 0, 1); 32 | 33 | public float X 34 | { 35 | get { return Values[0]; } 36 | set { Values[0] = value; } 37 | } 38 | 39 | public float Y 40 | { 41 | get { return Values[1]; } 42 | set { Values[1] = value; } 43 | } 44 | 45 | public float Z 46 | { 47 | get { return Values[2]; } 48 | set { Values[2] = value; } 49 | } 50 | 51 | public static Vector Zero => new Vector(0); 52 | private float[] Values { get; } 53 | 54 | public static implicit operator Point(Vector v) { 55 | return new Point((int)v.X, (int)v.Y); 56 | } 57 | 58 | public static implicit operator PointF(Vector v) { 59 | return new PointF(v.X, v.Y); 60 | } 61 | 62 | public static Vector operator -(Vector a, Vector b) { 63 | return new Vector(0) { 64 | Values = { 65 | [0] = a.Values[0] - b.Values[0], 66 | [1] = a.Values[1] - b.Values[1], 67 | [2] = a.Values[2] - b.Values[2] 68 | } 69 | }; 70 | } 71 | 72 | public static Vector operator *(Vector a, float factor) { 73 | return new Vector(0) { 74 | Values = { 75 | [0] = a.Values[0]*factor, 76 | [1] = a.Values[1]*factor, 77 | [2] = a.Values[2]*factor 78 | } 79 | }; 80 | } 81 | 82 | public static Vector operator /(Vector a, float factor) { 83 | return new Vector(0) { 84 | Values = { 85 | [0] = a.Values[0]/factor, 86 | [1] = a.Values[1]/factor, 87 | [2] = a.Values[2]/factor 88 | } 89 | }; 90 | } 91 | 92 | public static Vector operator +(Vector a, Vector b) { 93 | return new Vector(0) { 94 | Values = { 95 | [0] = a.Values[0] + b.Values[0], 96 | [1] = a.Values[1] + b.Values[1], 97 | [2] = a.Values[2] + b.Values[2] 98 | } 99 | }; 100 | } 101 | 102 | public Vector Cross(Vector v) { 103 | return new Vector(Y * v.Z - Z * v.Y, Z * v.X - X * v.Z, X * v.Y - Y * v.X); 104 | } 105 | 106 | public float Dot(Vector v) { 107 | return X * v.X + Y * v.Y + Z * v.Z; 108 | } 109 | 110 | public Vector Interpolate(Vector v, float factor) { 111 | return this + (v - this) * factor; 112 | } 113 | public Vector Normalize() { 114 | var length = Length; 115 | var factor = 0f; 116 | if (length > 0) { 117 | factor = 1.0f / length; 118 | } 119 | return new Vector(X * factor, Y * factor, Z * factor); 120 | } 121 | } 122 | } -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/SoftwareRenderer.csproj: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {2A47D0E8-32C8-4BC3-9C1F-A74D690BE7E7} 8 | WinExe 9 | Properties 10 | SoftwareRenderer 11 | SoftwareRenderer 12 | v4.6.1 13 | 512 14 | true 15 | 16 | 17 | AnyCPU 18 | true 19 | full 20 | false 21 | bin\Debug\ 22 | DEBUG;TRACE 23 | prompt 24 | 4 25 | true 26 | 27 | 28 | AnyCPU 29 | pdbonly 30 | true 31 | bin\Release\ 32 | TRACE 33 | prompt 34 | 4 35 | true 36 | 37 | 38 | 39 | 40 | 41 | app.manifest 42 | 43 | 44 | 45 | False 46 | Libs\FadeJson.dll 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | PreserveNewest 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 90 | -------------------------------------------------------------------------------- /src/web-paint/src/components/Toolbar.tsx: -------------------------------------------------------------------------------- 1 | import { Button, Popover, Radio } from "antd"; 2 | import { observer } from "mobx-react"; 3 | import * as React from "react"; 4 | import { ColorResult, SketchPicker } from "react-color"; 5 | import * as ReactDOM from "react-dom"; 6 | import DecimalSlider from "../components/DecimalSlider"; 7 | import EventBus from "../EventBus"; 8 | import PenType from "../interfaces/PenType"; 9 | import Store from "../store"; 10 | import Style from "./Toolbar.style"; 11 | 12 | const ButtonGroup = Button.Group; 13 | 14 | interface IToolbarProps { 15 | store: Store; 16 | } 17 | 18 | @observer 19 | class Toolbar extends React.Component { 20 | private store: Store; 21 | 22 | public constructor(props: IToolbarProps) { 23 | super(props); 24 | this.store = this.props.store; 25 | } 26 | 27 | public render() { 28 | return ( 29 |
30 | 31 | 37 | 38 | 39 | 40 | 44 | 铅笔 45 | 直线 46 | 矩形 47 | 正圆 48 | 49 | 50 | 51 | 52 | (this.store.lineWidth = e)} 59 | /> 60 | } 61 | arrowPointAtCenter> 62 | 63 | 64 | this.onLineColorChange(e)} 70 | /> 71 | } 72 | arrowPointAtCenter 73 | mouseLeaveDelay={0.2}> 74 | 75 | 76 | this.onFillColorChange(e)} 83 | /> 84 | } 85 | arrowPointAtCenter> 86 | 87 | 88 | 89 | 90 | 91 | 97 | 98 | 99 | 100 | 106 | 107 |
108 | ); 109 | } 110 | 111 | private onLineColorChange(e: ColorResult) { 112 | this.store.lineColor = e.hex; 113 | } 114 | 115 | private onFillColorChange(e: ColorResult) { 116 | this.store.fillColor = e.hex; 117 | } 118 | 119 | private onBtnClearClick(e: React.FormEvent) { 120 | EventBus.$emit("canvas:clearCommands"); 121 | } 122 | 123 | private onBtnSaveClick(e: React.FormEvent) { 124 | EventBus.$emit("canvas:save"); 125 | } 126 | 127 | private onBtnUndoClick(e: React.FormEvent) { 128 | EventBus.$emit("canvas:undo"); 129 | } 130 | 131 | private onDrawTypeChanged(e: any) { 132 | this.props.store.drawType = e.target.value; 133 | } 134 | } 135 | 136 | export default Toolbar; 137 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/GraphicsDevice.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Drawing; 3 | using System.Drawing.Imaging; 4 | using System.Runtime.InteropServices; 5 | 6 | namespace SoftwareRenderer 7 | { 8 | public class GraphicsDevice : IDisposable 9 | { 10 | private readonly byte[] bytes; 11 | private readonly Camera camera; 12 | private readonly Bitmap canvas; 13 | private readonly Graphics canvasGraphics; 14 | 15 | private readonly byte[] emptyBytes; 16 | private readonly float[] zBuffer; 17 | 18 | private Color lastClearColor; 19 | 20 | public GraphicsDevice(Bitmap bitmap, Camera camera) { 21 | canvas = bitmap; 22 | this.camera = camera; 23 | canvasGraphics = Graphics.FromImage(canvas); 24 | bytes = new byte[Width * Height * 4]; 25 | emptyBytes = new byte[Width * Height * 4]; 26 | zBuffer = new float[Width * Height]; 27 | } 28 | 29 | private int Height => canvas.Height; 30 | private int Width => canvas.Width; 31 | 32 | public void Clear(Color color) { 33 | Flush(); 34 | if (color != lastClearColor) { 35 | for (var i = 0; i < emptyBytes.Length; i += 4) { 36 | emptyBytes[i] = color.B; 37 | emptyBytes[i + 1] = color.G; 38 | emptyBytes[i + 2] = color.R; 39 | emptyBytes[i + 3] = color.A; 40 | } 41 | lastClearColor = color; 42 | } 43 | Array.Clear(zBuffer, 0, zBuffer.Length); 44 | Array.Copy(emptyBytes, bytes, emptyBytes.Length); 45 | } 46 | 47 | public void Dispose() { 48 | canvasGraphics.Dispose(); 49 | } 50 | 51 | public void DrawLine(Vector p0, Vector p1, Color color) { 52 | canvasGraphics.DrawLine(new Pen(color), p0, p1); 53 | } 54 | 55 | public void DrawMeshes(Mesh[] meshes, Color color) { 56 | var view = Matrix.LookAtLH(camera.Position, camera.Target, Vector.UnitY); 57 | var projection = Matrix.PerspectiveFovLH((float)(Math.PI / 4.0), (float)Width / Height, 0.1f, 1); 58 | 59 | foreach (var mesh in meshes) { 60 | var rotation = Matrix.Rotation(mesh.Rotation); 61 | var translation = Matrix.Translation(mesh.Position); 62 | var world = rotation * translation; 63 | var transform = world * view * projection; 64 | 65 | foreach (var face in mesh.Surfaces) { 66 | var v1 = Project(mesh.Vertices[face.A], transform); 67 | var v2 = Project(mesh.Vertices[face.B], transform); 68 | var v3 = Project(mesh.Vertices[face.C], transform); 69 | DrawTriangle(v1, v2, v3, color); 70 | } 71 | } 72 | } 73 | 74 | public void DrawPoint(Vector point, Color color) { 75 | DrawPoint((int)point.X, (int)point.Y, point.Z, color); 76 | } 77 | 78 | public void DrawPoint(int x, int y, Color color) { 79 | SetPixel(x, y, color); 80 | } 81 | 82 | public void DrawPoint(int x, int y, float z, Color color) { 83 | var index = y * Width + x; 84 | if (zBuffer[index] > z) { 85 | return; 86 | } 87 | zBuffer[index] = z; 88 | SetPixel(x, y, color); 89 | } 90 | 91 | public void DrawString(string str, Font font, Brush brush, float x, float y) { 92 | canvasGraphics.DrawString(str, font, brush, x, y); 93 | } 94 | 95 | public void DrawTriangle(Vector pa, Vector pb, Vector pc, Color color) { 96 | var a = pa - pb; 97 | var b = pc - pb; 98 | var n = a.Cross(b); 99 | var v = camera.Target - camera.Position; 100 | if (n.Dot(v) >= 0) { 101 | return; 102 | } 103 | DrawLine(pa, pb, color); 104 | DrawLine(pa, pc, color); 105 | DrawLine(pc, pb, color); 106 | } 107 | 108 | public void Flush() { 109 | var bits = canvas.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, canvas.PixelFormat); 110 | Marshal.Copy(bytes, 0, bits.Scan0, bytes.Length); 111 | canvas.UnlockBits(bits); 112 | } 113 | 114 | private Vector Project(Vector coord, Matrix transformMatrix) { 115 | var p = transformMatrix.Transform(coord); 116 | p.X = p.X * Width + Width / 2f; 117 | p.Y = -p.Y * Height + Height / 2f; 118 | return p; 119 | } 120 | 121 | private void SetPixel(int x, int y, Color color) { 122 | if (x < 0 || x >= Width || y < 0 || y >= Height) { 123 | return; 124 | } 125 | var index = (x + y * Width) * 4; 126 | bytes[index] = color.B; 127 | bytes[index + 1] = color.G; 128 | bytes[index + 2] = color.R; 129 | bytes[index + 3] = color.A; 130 | } 131 | } 132 | } -------------------------------------------------------------------------------- /src/BrainfuckInterpreter/.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | [Ll]og/ 24 | 25 | # Visual Studio 2015 cache/options directory 26 | .vs/ 27 | # Uncomment if you have tasks that create the project's static files in wwwroot 28 | #wwwroot/ 29 | 30 | # MSTest test Results 31 | [Tt]est[Rr]esult*/ 32 | [Bb]uild[Ll]og.* 33 | 34 | # NUNIT 35 | *.VisualState.xml 36 | TestResult.xml 37 | 38 | # Build Results of an ATL Project 39 | [Dd]ebugPS/ 40 | [Rr]eleasePS/ 41 | dlldata.c 42 | 43 | # DNX 44 | project.lock.json 45 | project.fragment.lock.json 46 | artifacts/ 47 | 48 | *_i.c 49 | *_p.c 50 | *_i.h 51 | *.ilk 52 | *.meta 53 | *.obj 54 | *.pch 55 | *.pdb 56 | *.pgc 57 | *.pgd 58 | *.rsp 59 | *.sbr 60 | *.tlb 61 | *.tli 62 | *.tlh 63 | *.tmp 64 | *.tmp_proj 65 | *.log 66 | *.vspscc 67 | *.vssscc 68 | .builds 69 | *.pidb 70 | *.svclog 71 | *.scc 72 | 73 | # Chutzpah Test files 74 | _Chutzpah* 75 | 76 | # Visual C++ cache files 77 | ipch/ 78 | *.aps 79 | *.ncb 80 | *.opendb 81 | *.opensdf 82 | *.sdf 83 | *.cachefile 84 | *.VC.db 85 | *.VC.VC.opendb 86 | 87 | # Visual Studio profiler 88 | *.psess 89 | *.vsp 90 | *.vspx 91 | *.sap 92 | 93 | # TFS 2012 Local Workspace 94 | $tf/ 95 | 96 | # Guidance Automation Toolkit 97 | *.gpState 98 | 99 | # ReSharper is a .NET coding add-in 100 | _ReSharper*/ 101 | *.[Rr]e[Ss]harper 102 | *.DotSettings.user 103 | 104 | # JustCode is a .NET coding add-in 105 | .JustCode 106 | 107 | # TeamCity is a build add-in 108 | _TeamCity* 109 | 110 | # DotCover is a Code Coverage Tool 111 | *.dotCover 112 | 113 | # NCrunch 114 | _NCrunch_* 115 | .*crunch*.local.xml 116 | nCrunchTemp_* 117 | 118 | # MightyMoose 119 | *.mm.* 120 | AutoTest.Net/ 121 | 122 | # Web workbench (sass) 123 | .sass-cache/ 124 | 125 | # Installshield output folder 126 | [Ee]xpress/ 127 | 128 | # DocProject is a documentation generator add-in 129 | DocProject/buildhelp/ 130 | DocProject/Help/*.HxT 131 | DocProject/Help/*.HxC 132 | DocProject/Help/*.hhc 133 | DocProject/Help/*.hhk 134 | DocProject/Help/*.hhp 135 | DocProject/Help/Html2 136 | DocProject/Help/html 137 | 138 | # Click-Once directory 139 | publish/ 140 | 141 | # Publish Web Output 142 | *.[Pp]ublish.xml 143 | *.azurePubxml 144 | # TODO: Comment the next line if you want to checkin your web deploy settings 145 | # but database connection strings (with potential passwords) will be unencrypted 146 | #*.pubxml 147 | *.publishproj 148 | 149 | # Microsoft Azure Web App publish settings. Comment the next line if you want to 150 | # checkin your Azure Web App publish settings, but sensitive information contained 151 | # in these scripts will be unencrypted 152 | PublishScripts/ 153 | 154 | # NuGet Packages 155 | *.nupkg 156 | # The packages folder can be ignored because of Package Restore 157 | **/packages/* 158 | # except build/, which is used as an MSBuild target. 159 | !**/packages/build/ 160 | # Uncomment if necessary however generally it will be regenerated when needed 161 | #!**/packages/repositories.config 162 | # NuGet v3's project.json files produces more ignoreable files 163 | *.nuget.props 164 | *.nuget.targets 165 | 166 | # Microsoft Azure Build Output 167 | csx/ 168 | *.build.csdef 169 | 170 | # Microsoft Azure Emulator 171 | ecf/ 172 | rcf/ 173 | 174 | # Windows Store app package directories and files 175 | AppPackages/ 176 | BundleArtifacts/ 177 | Package.StoreAssociation.xml 178 | _pkginfo.txt 179 | 180 | # Visual Studio cache files 181 | # files ending in .cache can be ignored 182 | *.[Cc]ache 183 | # but keep track of directories ending in .cache 184 | !*.[Cc]ache/ 185 | 186 | # Others 187 | ClientBin/ 188 | ~$* 189 | *~ 190 | *.dbmdl 191 | *.dbproj.schemaview 192 | *.jfm 193 | *.pfx 194 | *.publishsettings 195 | node_modules/ 196 | orleans.codegen.cs 197 | 198 | # Since there are multiple workflows, uncomment next line to ignore bower_components 199 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) 200 | #bower_components/ 201 | 202 | # RIA/Silverlight projects 203 | Generated_Code/ 204 | 205 | # Backup & report files from converting an old project file 206 | # to a newer Visual Studio version. Backup files are not needed, 207 | # because we have git ;-) 208 | _UpgradeReport_Files/ 209 | Backup*/ 210 | UpgradeLog*.XML 211 | UpgradeLog*.htm 212 | 213 | # SQL Server files 214 | *.mdf 215 | *.ldf 216 | 217 | # Business Intelligence projects 218 | *.rdl.data 219 | *.bim.layout 220 | *.bim_*.settings 221 | 222 | # Microsoft Fakes 223 | FakesAssemblies/ 224 | 225 | # GhostDoc plugin setting file 226 | *.GhostDoc.xml 227 | 228 | # Node.js Tools for Visual Studio 229 | .ntvs_analysis.dat 230 | 231 | # Visual Studio 6 build log 232 | *.plg 233 | 234 | # Visual Studio 6 workspace options file 235 | *.opt 236 | 237 | # Visual Studio LightSwitch build output 238 | **/*.HTMLClient/GeneratedArtifacts 239 | **/*.DesktopClient/GeneratedArtifacts 240 | **/*.DesktopClient/ModelManifest.xml 241 | **/*.Server/GeneratedArtifacts 242 | **/*.Server/ModelManifest.xml 243 | _Pvt_Extensions 244 | 245 | # Paket dependency manager 246 | .paket/paket.exe 247 | paket-files/ 248 | 249 | # FAKE - F# Make 250 | .fake/ 251 | 252 | # JetBrains Rider 253 | .idea/ 254 | *.sln.iml 255 | 256 | # CodeRush 257 | .cr/ 258 | 259 | # Python Tools for Visual Studio (PTVS) 260 | __pycache__/ 261 | *.pyc -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | ## Ignore Visual Studio temporary files, build results, and 2 | ## files generated by popular Visual Studio add-ons. 3 | 4 | # User-specific files 5 | *.suo 6 | *.user 7 | *.userosscache 8 | *.sln.docstates 9 | 10 | # User-specific files (MonoDevelop/Xamarin Studio) 11 | *.userprefs 12 | 13 | # Build results 14 | [Dd]ebug/ 15 | [Dd]ebugPublic/ 16 | [Rr]elease/ 17 | [Rr]eleases/ 18 | x64/ 19 | x86/ 20 | bld/ 21 | [Bb]in/ 22 | [Oo]bj/ 23 | 24 | # Visual Studio 2015 cache/options directory 25 | .vs/ 26 | # Uncomment if you have tasks that create the project's static files in wwwroot 27 | #wwwroot/ 28 | 29 | # MSTest test Results 30 | [Tt]est[Rr]esult*/ 31 | [Bb]uild[Ll]og.* 32 | 33 | # NUNIT 34 | *.VisualState.xml 35 | TestResult.xml 36 | 37 | # Build Results of an ATL Project 38 | [Dd]ebugPS/ 39 | [Rr]eleasePS/ 40 | dlldata.c 41 | 42 | # DNX 43 | project.lock.json 44 | artifacts/ 45 | 46 | *_i.c 47 | *_p.c 48 | *_i.h 49 | *.ilk 50 | *.meta 51 | *.obj 52 | *.pch 53 | *.pdb 54 | *.pgc 55 | *.pgd 56 | *.rsp 57 | *.sbr 58 | *.tlb 59 | *.tli 60 | *.tlh 61 | *.tmp 62 | *.tmp_proj 63 | *.log 64 | *.vspscc 65 | *.vssscc 66 | .builds 67 | *.pidb 68 | *.svclog 69 | *.scc 70 | 71 | # Chutzpah Test files 72 | _Chutzpah* 73 | 74 | # Visual C++ cache files 75 | ipch/ 76 | *.aps 77 | *.ncb 78 | *.opensdf 79 | *.sdf 80 | *.cachefile 81 | 82 | # Visual Studio profiler 83 | *.psess 84 | *.vsp 85 | *.vspx 86 | *.sap 87 | 88 | # TFS 2012 Local Workspace 89 | $tf/ 90 | 91 | # Guidance Automation Toolkit 92 | *.gpState 93 | 94 | # ReSharper is a .NET coding add-in 95 | _ReSharper*/ 96 | *.[Rr]e[Ss]harper 97 | *.DotSettings.user 98 | 99 | # JustCode is a .NET coding add-in 100 | .JustCode 101 | 102 | # TeamCity is a build add-in 103 | _TeamCity* 104 | 105 | # DotCover is a Code Coverage Tool 106 | *.dotCover 107 | 108 | # NCrunch 109 | _NCrunch_* 110 | .*crunch*.local.xml 111 | nCrunchTemp_* 112 | 113 | # MightyMoose 114 | *.mm.* 115 | AutoTest.Net/ 116 | 117 | # Web workbench (sass) 118 | .sass-cache/ 119 | 120 | # Installshield output folder 121 | [Ee]xpress/ 122 | 123 | # DocProject is a documentation generator add-in 124 | DocProject/buildhelp/ 125 | DocProject/Help/*.HxT 126 | DocProject/Help/*.HxC 127 | DocProject/Help/*.hhc 128 | DocProject/Help/*.hhk 129 | DocProject/Help/*.hhp 130 | DocProject/Help/Html2 131 | DocProject/Help/html 132 | 133 | # Click-Once directory 134 | publish/ 135 | 136 | # Publish Web Output 137 | *.[Pp]ublish.xml 138 | *.azurePubxml 139 | # TODO: Comment the next line if you want to checkin your web deploy settings 140 | # but database connection strings (with potential passwords) will be unencrypted 141 | *.pubxml 142 | *.publishproj 143 | 144 | # NuGet Packages 145 | *.nupkg 146 | # The packages folder can be ignored because of Package Restore 147 | **/packages/* 148 | # except build/, which is used as an MSBuild target. 149 | !**/packages/build/ 150 | # Uncomment if necessary however generally it will be regenerated when needed 151 | #!**/packages/repositories.config 152 | 153 | # Windows Azure Build Output 154 | csx/ 155 | *.build.csdef 156 | 157 | # Windows Azure Emulator 158 | efc/ 159 | rfc/ 160 | 161 | # Windows Store app package directory 162 | AppPackages/ 163 | 164 | # Visual Studio cache files 165 | # files ending in .cache can be ignored 166 | *.[Cc]ache 167 | # but keep track of directories ending in .cache 168 | !*.[Cc]ache/ 169 | 170 | # Others 171 | ClientBin/ 172 | [Ss]tyle[Cc]op.* 173 | ~$* 174 | *~ 175 | *.dbmdl 176 | *.dbproj.schemaview 177 | *.pfx 178 | *.publishsettings 179 | node_modules/ 180 | orleans.codegen.cs 181 | 182 | # RIA/Silverlight projects 183 | Generated_Code/ 184 | 185 | # Backup & report files from converting an old project file 186 | # to a newer Visual Studio version. Backup files are not needed, 187 | # because we have git ;-) 188 | _UpgradeReport_Files/ 189 | Backup*/ 190 | UpgradeLog*.XML 191 | UpgradeLog*.htm 192 | 193 | # SQL Server files 194 | *.mdf 195 | *.ldf 196 | 197 | # Business Intelligence projects 198 | *.rdl.data 199 | *.bim.layout 200 | *.bim_*.settings 201 | 202 | # Microsoft Fakes 203 | FakesAssemblies/ 204 | 205 | # GhostDoc plugin setting file 206 | *.GhostDoc.xml 207 | 208 | # Node.js Tools for Visual Studio 209 | .ntvs_analysis.dat 210 | 211 | # Visual Studio 6 build log 212 | *.plg 213 | 214 | # Visual Studio 6 workspace options file 215 | *.opt 216 | 217 | # Visual Studio LightSwitch build output 218 | **/*.HTMLClient/GeneratedArtifacts 219 | **/*.DesktopClient/GeneratedArtifacts 220 | **/*.DesktopClient/ModelManifest.xml 221 | **/*.Server/GeneratedArtifacts 222 | **/*.Server/ModelManifest.xml 223 | _Pvt_Extensions 224 | 225 | # Paket dependency manager 226 | .paket/paket.exe 227 | 228 | # FAKE - F# Make 229 | .fake/ 230 | 231 | # ========================= 232 | # Operating System Files 233 | # ========================= 234 | 235 | # OSX 236 | # ========================= 237 | 238 | .DS_Store 239 | .AppleDouble 240 | .LSOverride 241 | 242 | # Thumbnails 243 | ._* 244 | 245 | # Files that might appear in the root of a volume 246 | .DocumentRevisions-V100 247 | .fseventsd 248 | .Spotlight-V100 249 | .TemporaryItems 250 | .Trashes 251 | .VolumeIcon.icns 252 | 253 | # Directories potentially created on remote AFP share 254 | .AppleDB 255 | .AppleDesktop 256 | Network Trash Folder 257 | Temporary Items 258 | .apdisk 259 | 260 | # Windows 261 | # ========================= 262 | 263 | # Windows image file caches 264 | Thumbs.db 265 | ehthumbs.db 266 | 267 | # Folder config file 268 | Desktop.ini 269 | 270 | # Recycle Bin used on file shares 271 | $RECYCLE.BIN/ 272 | 273 | # Windows Installer files 274 | *.cab 275 | *.msi 276 | *.msm 277 | *.msp 278 | 279 | # Windows shortcuts 280 | *.lnk 281 | 282 | dist/ 283 | .vscode -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Matrix.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | 4 | namespace SoftwareRenderer 5 | { 6 | public struct Matrix 7 | { 8 | public Matrix(float[] values = null) { 9 | Values = new float[16]; 10 | if (values == null) { 11 | return; 12 | } 13 | for (var i = 0; i < Values.Length; i++) { 14 | Values[i] = values[i]; 15 | } 16 | } 17 | 18 | public static Matrix Identity => new Matrix(new float[16] { 19 | 1, 0, 0, 0, 20 | 0, 1, 0, 0, 21 | 0, 0, 1, 0, 22 | 0, 0, 0, 1 23 | }); 24 | 25 | public float[] Values { get; } 26 | 27 | public static Matrix LookAtLH(Vector eye, Vector target, Vector up) { 28 | var axisZ = (target - eye).Normalize(); 29 | var axisX = up.Cross(axisZ).Normalize(); 30 | var axisY = axisZ.Cross(axisX).Normalize(); 31 | 32 | var eyeX = -axisX.Dot(eye); 33 | var eyeY = -axisY.Dot(eye); 34 | var eyeZ = -axisZ.Dot(eye); 35 | 36 | return new Matrix(new[] { 37 | axisX.X, axisY.X, axisZ.X, 0, 38 | axisX.Y, axisY.Y, axisZ.Y, 0, 39 | axisX.Z, axisY.Z, axisZ.Z, 0, 40 | eyeX, eyeY, eyeZ, 1 41 | }); 42 | } 43 | 44 | public static bool operator !=(Matrix a, Matrix b) { 45 | return !(a == b); 46 | } 47 | 48 | public static Matrix operator *(Matrix a, Matrix b) { 49 | var values = new float[16]; 50 | for (var index = 0; index < 16; index++) { 51 | var i = index / 4; 52 | var j = index % 4; 53 | values[index] = 54 | a.Values[i * 4] * b.Values[j] + 55 | a.Values[i * 4 + 1] * b.Values[1 * 4 + j] + 56 | a.Values[i * 4 + 2] * b.Values[2 * 4 + j] + 57 | a.Values[i * 4 + 3] * b.Values[3 * 4 + j]; 58 | } 59 | return new Matrix(values); 60 | } 61 | 62 | public static bool operator ==(Matrix a, Matrix b) { 63 | return !a.Values.Where((t, i) => Math.Abs(t - b.Values[i]) > float.MinValue).Any(); 64 | } 65 | 66 | public static Matrix PerspectiveFovLH(float fieldOfView, float aspect, float znear, float zfar) { 67 | var height = 1 / (float)Math.Tan(fieldOfView / 2); 68 | var width = height / aspect; 69 | return new Matrix(new[] { 70 | width, 0, 0, 0, 71 | 0, height, 0, 0, 72 | 0, 0, zfar/(zfar - znear), 1, 73 | 0, 0, znear*zfar/(znear - zfar), 0 74 | }); 75 | } 76 | 77 | public static Matrix Rotation(Vector r) { 78 | var x = RotationX(r.X); 79 | var y = RotationY(r.Y); 80 | var z = RotationZ(r.Z); 81 | return z * x * y; 82 | } 83 | 84 | public static Matrix RotationX(float angle) { 85 | var s = (float)Math.Sin(angle); 86 | var c = (float)Math.Cos(angle); 87 | var values = new[] { 88 | 1, 0, 0, 0, 89 | 0, c, s, 0, 90 | 0, -s, c, 0, 91 | 0, 0, 0, 1 92 | }; 93 | return new Matrix(values); 94 | } 95 | 96 | public static Matrix RotationY(float angle) { 97 | var s = (float)Math.Sin(angle); 98 | var c = (float)Math.Cos(angle); 99 | var values = new[] { 100 | c, 0, -s, 0, 101 | 0, 1, 0, 0, 102 | s, 0, c, 0, 103 | 0, 0, 0, 1 104 | }; 105 | return new Matrix(values); 106 | } 107 | 108 | public static Matrix RotationZ(float angle) { 109 | var s = (float)Math.Sin(angle); 110 | var c = (float)Math.Cos(angle); 111 | var values = new[] { 112 | c, s, 0, 0, 113 | -s, c, 0, 0, 114 | 0, 0, 1, 0, 115 | 0, 0, 0, 1, 116 | }; 117 | return new Matrix(values); 118 | } 119 | 120 | public static Matrix Scale(Vector s) { 121 | var values = new[] { 122 | s.X, 0, 0, 0, 123 | 0, s.Y, 0, 0, 124 | 0, 0, s.Z, 0, 125 | 0, 0, 0, 1 126 | }; 127 | return new Matrix(values); 128 | } 129 | 130 | public static Matrix Translation(Vector t) { 131 | var values = new[] { 132 | 1, 0, 0, 0, 133 | 0, 1, 0, 0, 134 | 0, 0, 1, 0, 135 | t.X, t.Y, t.Z, 1 136 | }; 137 | return new Matrix(values); 138 | } 139 | 140 | public bool Equals(Matrix other) { 141 | return Equals(Values, other.Values); 142 | } 143 | 144 | public override bool Equals(object obj) { 145 | if (ReferenceEquals(null, obj)) { 146 | return false; 147 | } 148 | return obj is Matrix && Equals((Matrix)obj); 149 | } 150 | 151 | public override int GetHashCode() { 152 | return Values?.GetHashCode() ?? 0; 153 | } 154 | 155 | public Vector Transform(Vector v) { 156 | var x = v.X * Values[0 * 4 + 0] + v.Y * Values[1 * 4 + 0] + v.Z * Values[2 * 4 + 0] + Values[3 * 4 + 0]; 157 | var y = v.X * Values[0 * 4 + 1] + v.Y * Values[1 * 4 + 1] + v.Z * Values[2 * 4 + 1] + Values[3 * 4 + 1]; 158 | var z = v.X * Values[0 * 4 + 2] + v.Y * Values[1 * 4 + 2] + v.Z * Values[2 * 4 + 2] + Values[3 * 4 + 2]; 159 | var w = v.X * Values[0 * 4 + 3] + v.Y * Values[1 * 4 + 3] + v.Z * Values[2 * 4 + 3] + Values[3 * 4 + 3]; 160 | return new Vector(x / w, y / w, z / w); 161 | } 162 | } 163 | } -------------------------------------------------------------------------------- /src/web-paint/src/components/Canvas.tsx: -------------------------------------------------------------------------------- 1 | import { Card, Input, message, Modal } from "antd"; 2 | import { saveAs } from "file-saver"; 3 | import { autorun, IReactionDisposer } from "mobx"; 4 | import { observer } from "mobx-react"; 5 | import * as React from "react"; 6 | import * as ReactDOM from "react-dom"; 7 | import EventBus from "../EventBus"; 8 | import IDrawCommand from "../interfaces/IDrawCommand"; 9 | import IPoint from "../interfaces/IPoint"; 10 | import PenType from "../interfaces/PenType"; 11 | import MouseState from "../MouseState"; 12 | import Store from "../store"; 13 | 14 | interface ICanvasProps { 15 | id: string; 16 | width: number; 17 | height: number; 18 | store: Store; 19 | style: React.CSSProperties; 20 | } 21 | 22 | @observer 23 | class Canvas extends React.Component { 24 | private store: Store; 25 | private rect: any; 26 | private prevPath: IPoint[] = []; 27 | private drawDisposer: IReactionDisposer; 28 | 29 | public constructor(props: ICanvasProps) { 30 | super(props); 31 | this.store = props.store; 32 | } 33 | 34 | public clearCanvas() { 35 | const { width, height } = this.props; 36 | this.ctx.fillStyle = "#fff"; 37 | this.ctx.fillRect(0, 0, width, height); 38 | } 39 | 40 | public clearCommands() { 41 | this.store.drawCommands = []; 42 | } 43 | 44 | public undo() { 45 | this.store.drawCommands.pop(); 46 | } 47 | 48 | public draw(commands: IDrawCommand[]) { 49 | this.clearCanvas(); 50 | commands.forEach(it => { 51 | this.drawCommand(it); 52 | }); 53 | } 54 | 55 | public render() { 56 | const { width, height, id, style } = this.props; 57 | return ( 58 |
59 | this.onMouseEnter(e)} 65 | onMouseLeave={e => this.onMouseLeave(e)} 66 | onMouseDown={e => this.onMouseDown(e)} 67 | onMouseUp={e => this.onMouseUp(e)} 68 | onMouseMove={e => this.onMouseMove(e)}> 69 | 浏览器不兼容canvas,无法画图 70 | 71 | this.onSaveOk(e)} 75 | onCancel={e => this.onSaveCancel(e)}> 76 | (this.store.fileName = e.target.value)} 81 | /> 82 | 83 |
84 | ); 85 | } 86 | 87 | public componentDidMount() { 88 | this.drawDisposer = autorun(() => { 89 | this.draw(this.store.drawCommands); 90 | }); 91 | EventBus.$on("canvas:clearCommands", this.clearCommands.bind(this)); 92 | EventBus.$on("canvas:undo", this.undo.bind(this)); 93 | EventBus.$on("canvas:save", this.save.bind(this)); 94 | } 95 | 96 | public componentWillUnmount() { 97 | this.drawDisposer(); 98 | } 99 | 100 | private get Position(): IPoint { 101 | const rect = ReactDOM.findDOMNode(this.canvas).getBoundingClientRect(); 102 | return { x: rect.left, y: rect.top }; 103 | } 104 | 105 | private get canvas(): HTMLCanvasElement { 106 | const canvas = document.getElementById(this.props.id); 107 | if (!canvas) { 108 | throw new Error("[FATAL] Canvas is null"); 109 | } 110 | return canvas as HTMLCanvasElement; 111 | } 112 | 113 | private get ctx(): CanvasRenderingContext2D { 114 | const ctx = this.canvas.getContext("2d"); 115 | if (!ctx) { 116 | throw new Error("[FATAL] ctx is null"); 117 | } 118 | return ctx; 119 | } 120 | 121 | private drawCommand(command: IDrawCommand) { 122 | const ctx = this.ctx; 123 | const { fillColor, lineColor, lineWidth, type, path } = command; 124 | 125 | ctx.beginPath(); 126 | ctx.lineWidth = lineWidth; 127 | ctx.strokeStyle = lineColor; 128 | ctx.fillStyle = fillColor; 129 | switch (type) { 130 | case PenType.Point: { 131 | const point = path[0]; 132 | ctx.fillRect(point.x, point.y, 1, 1); 133 | break; 134 | } 135 | case PenType.Line: { 136 | const start = path[0]; 137 | const end = path[1]; 138 | ctx.moveTo(start.x, start.y); 139 | ctx.lineTo(end.x, end.y); 140 | break; 141 | } 142 | case PenType.Lines: { 143 | const fstPoint = path[0]; 144 | ctx.moveTo(fstPoint.x, fstPoint.y); 145 | let prev = fstPoint; 146 | let cur: IPoint; 147 | for (let i = 1; i < path.length; i++) { 148 | cur = path[i]; 149 | ctx.lineTo(cur.x, cur.y); 150 | ctx.moveTo(cur.x, cur.y); 151 | prev = cur; 152 | } 153 | break; 154 | } 155 | case PenType.Rect: { 156 | let { x, y } = path[0]; 157 | let x1 = path[1].x; 158 | let y1 = path[1].y; 159 | 160 | const width = Math.abs(x1 - x); 161 | const height = Math.abs(y1 - y); 162 | 163 | if (x1 < x && y1 < y) { 164 | [x, x1] = [x1, x]; 165 | [y, y1] = [y1, y]; 166 | } 167 | 168 | if (x1 < x && y1 > y) { 169 | [x, y] = [x - width, y]; 170 | [x1, y1] = [x1 + width, y1]; 171 | } 172 | 173 | if (x1 > x && y1 < y) { 174 | [x, y] = [x, y - height]; 175 | [x1, y1] = [x1, y1 + height]; 176 | } 177 | 178 | ctx.fillStyle = lineColor; 179 | ctx.fillRect( 180 | x - lineWidth, 181 | y - lineWidth, 182 | width + lineWidth * 2, 183 | height + lineWidth * 2, 184 | ); 185 | ctx.fillStyle = fillColor; 186 | ctx.fillRect(x, y, width, height); 187 | 188 | break; 189 | } 190 | case PenType.Circle: { 191 | const origin = path[0]; 192 | const p = path[1]; 193 | const offsetX = origin.x - p.x; 194 | const offsetY = origin.y - p.y; 195 | const radius = Math.sqrt( 196 | Math.abs(offsetX) ** 2 + Math.abs(offsetY) ** 2, 197 | ); 198 | ctx.arc(origin.x, origin.y, radius, 0, 2 * Math.PI); 199 | ctx.fill(); 200 | break; 201 | } 202 | } 203 | ctx.stroke(); 204 | } 205 | 206 | private createDrawCommand(path: IPoint[]): IDrawCommand { 207 | const clone = (e: string) => JSON.parse(JSON.stringify({ str: e })).str; 208 | 209 | const type = this.store.drawType; 210 | const lineWidth = this.store.lineWidth; 211 | const lineColor = clone(this.store.lineColor); 212 | const fillColor = clone(this.store.fillColor); 213 | 214 | switch (type) { 215 | case PenType.Line: { 216 | return { 217 | type, 218 | path: [path[0], path[path.length - 1]], 219 | lineWidth, 220 | lineColor, 221 | fillColor, 222 | }; 223 | } 224 | case PenType.Lines: { 225 | if (path.length === 1) { 226 | return { 227 | type: PenType.Point, 228 | path: [path[path.length - 1]], 229 | lineWidth, 230 | lineColor, 231 | fillColor, 232 | }; 233 | } 234 | return { type, path, lineWidth, lineColor, fillColor }; 235 | } 236 | case PenType.Rect: { 237 | return { 238 | type, 239 | path: [path[0], path[path.length - 1]], 240 | lineWidth, 241 | lineColor, 242 | fillColor, 243 | }; 244 | } 245 | case PenType.Circle: { 246 | return { 247 | type, 248 | path: [path[0], path[path.length - 1]], 249 | lineWidth, 250 | lineColor, 251 | fillColor, 252 | }; 253 | } 254 | default: { 255 | throw new Error("Cannot reach here"); 256 | } 257 | } 258 | } 259 | 260 | private onMouseEnter(e: React.MouseEvent) { 261 | this.store.mouseState = MouseState.InsideCanvasMouseUp; 262 | } 263 | 264 | private onMouseLeave(e: React.MouseEvent) { 265 | this.store.mouseState = MouseState.OutsideCanvas; 266 | } 267 | 268 | private onMouseDown(e: React.MouseEvent) { 269 | this.store.mouseState = MouseState.InsideCanvasMouseDown; 270 | } 271 | 272 | private onMouseUp(e: React.MouseEvent) { 273 | this.store.mouseState = MouseState.InsideCanvasMouseUp; 274 | 275 | e.persist(); 276 | let { x, y } = this.Position; 277 | x = e.pageX - x; 278 | y = e.pageY - y; 279 | 280 | const path = this.prevPath.length === 0 ? [{ x, y }] : this.prevPath; 281 | 282 | const command = this.createDrawCommand(path); 283 | // 提交画图命令 284 | this.store.drawCommands.push(command); 285 | // 清空之前的鼠标路径 286 | this.prevPath = []; 287 | } 288 | 289 | private onMouseMove(e: React.MouseEvent) { 290 | e.persist(); 291 | 292 | // 鼠标坐标从屏幕坐标系转换成canvas坐标系 293 | let { x, y } = this.Position; 294 | x = e.pageX - x; 295 | y = e.pageY - y; 296 | 297 | // 鼠标在画布上左键按下并且拖动 298 | if (this.store.mouseState === MouseState.InsideCanvasMouseDown) { 299 | this.prevPath.push({ x, y } as IPoint); 300 | // 预览绘图结果 301 | const command = this.createDrawCommand(this.prevPath); 302 | this.draw(this.store.drawCommands); 303 | this.drawCommand(command); 304 | } 305 | } 306 | 307 | private save() { 308 | this.store.isFileNameDialogShow = true; 309 | } 310 | 311 | private onSaveCancel(e: React.MouseEvent) { 312 | this.store.isFileNameDialogShow = false; 313 | } 314 | 315 | private onSaveOk(e: React.MouseEvent) { 316 | this.canvas.toBlob(blob => { 317 | if (blob) { 318 | saveAs(blob, this.store.fileName); 319 | this.store.isFileNameDialogShow = false; 320 | } else { 321 | message.error("保存失败。将画布转换为文件时出错。"); 322 | } 323 | }); 324 | } 325 | } 326 | 327 | export default Canvas; 328 | -------------------------------------------------------------------------------- /src/SoftwareRenderer/SoftwareRenderer/Contents/monkey.babylon: -------------------------------------------------------------------------------- 1 | { 2 | "autoClear": true, 3 | "clearColor": [ 0.0000, 0.0000, 0.0000 ], 4 | "ambientColor": [ 0.0000, 0.0000, 0.0000 ], 5 | "gravity": [ 0.0000, -9.8100, 0.0000 ], 6 | "cameras": [ 7 | { 8 | "name": "Camera", 9 | "id": "Camera", 10 | "position": [ 7.4811, 5.3437, -6.5076 ], 11 | "target": [ -0.3174, 0.8953, 0.3125 ], 12 | "fov": 0.8576, 13 | "minZ": 0.1000, 14 | "maxZ": 100.0000, 15 | "speed": 1.0000, 16 | "inertia": 0.9000, 17 | "checkCollisions": false, 18 | "applyGravity": false, 19 | "ellipsoid": [ 0.2000, 0.9000, 0.2000 ] 20 | } 21 | ], 22 | "activeCamera": "Camera", 23 | "lights": [ 24 | { 25 | "name": "Lamp", 26 | "id": "Lamp", 27 | "type": 0.0000, 28 | "data": [ 4.0762, 5.9039, 1.0055 ], 29 | "intensity": 1.0000, 30 | "diffuse": [ 1.0000, 1.0000, 1.0000 ], 31 | "specular": [ 1.0000, 1.0000, 1.0000 ] 32 | } 33 | ], 34 | "materials": [ ], 35 | "meshes": [ 36 | { 37 | "name": "Suzanne", 38 | "id": "Suzanne", 39 | "position": [ 0.0000, 0.0000, 0.0000 ], 40 | "rotation": [ 0.0000, 0.0000, 0.0000 ], 41 | "scaling": [ 1.0000, 1.0000, 1.0000 ], 42 | "isVisible": true, 43 | "isEnabled": true, 44 | "checkCollisions": false, 45 | "billboardMode": 0, 46 | "uvCount": 0, 47 | "vertices": [ 0.4688, 0.2422, -0.7578, 0.9693, -0.0118, -0.2456, 0.4375, 0.1641, -0.7656, 0.7290, -0.6566, -0.1934, 0.5000, 0.0937, -0.6875, 0.6076, -0.5104, -0.6085, -0.5000, 0.0937, -0.6875, -0.6053, -0.5058, -0.6146, -0.4375, 0.1641, -0.7656, -0.7116, -0.6793, -0.1793, -0.5625, 0.2422, -0.6719, -0.8018, -0.0010, -0.5976, 0.5625, 0.2422, -0.6719, 0.8001, -0.0028, -0.5998, 0.5469, 0.0547, -0.5781, 0.6802, -0.5463, -0.4888, -0.5469, 0.0547, -0.5781, -0.6836, -0.5473, -0.4827, -0.6250, 0.2422, -0.5625, -0.8684, -0.0023, -0.4958, 0.3516, 0.0312, -0.7188, 0.0967, -0.7558, -0.6475, 0.3516, -0.0234, -0.6172, 0.1160, -0.8693, -0.4805, -0.3516, -0.0234, -0.6172, -0.1128, -0.8748, -0.4711, -0.3516, 0.0312, -0.7188, -0.0996, -0.7466, -0.6577, 0.3516, 0.1328, -0.7812, 0.0395, -0.9631, -0.2661, -0.3516, 0.1328, -0.7812, -0.0406, -0.9693, -0.2424, 0.2734, 0.1641, -0.7969, -0.6386, -0.6965, -0.3272, -0.2031, 0.0937, -0.7422, 0.4563, -0.5354, -0.7107, -0.2734, 0.1641, -0.7969, 0.6531, -0.6866, -0.3193, 0.2031, 0.0937, -0.7422, -0.4549, -0.5415, -0.7069, -0.1562, 0.0547, -0.6484, 0.5538, -0.6332, -0.5406, 0.1406, 0.2422, -0.7422, -0.6901, 0.0003, -0.7237, 0.0781, 0.2422, -0.6562, -0.8119, -0.0009, -0.5837, -0.0781, 0.2422, -0.6562, 0.8097, -0.0070, -0.5867, -0.1406, 0.2422, -0.7422, 0.6893, -0.0046, -0.7244, 0.2422, 0.2422, -0.7969, -0.9557, -0.0183, -0.2936, -0.2422, 0.2422, -0.7969, 0.9526, -0.0131, -0.3040, 0.2734, 0.3281, -0.7969, -0.6458, 0.6947, -0.3166, -0.2031, 0.3906, -0.7422, 0.4559, 0.5222, -0.7207, -0.2734, 0.3281, -0.7969, 0.6644, 0.6821, -0.3056, 0.2031, 0.3906, -0.7422, -0.4604, 0.5277, -0.7138, 0.1562, 0.4375, -0.6484, -0.5250, 0.6254, -0.5771, -0.1562, 0.4375, -0.6484, 0.5306, 0.6258, -0.5717, 0.3516, 0.4531, -0.7188, 0.1005, 0.7447, -0.6598, 0.3516, 0.5156, -0.6172, 0.1226, 0.8395, -0.5293, -0.3516, 0.5156, -0.6172, -0.1195, 0.8455, -0.5203, -0.3516, 0.4531, -0.7188, -0.1034, 0.7350, -0.6701, 0.3516, 0.3594, -0.7812, 0.0340, 0.9690, -0.2445, -0.3516, 0.3594, -0.7812, -0.0351, 0.9748, -0.2204, 0.4375, 0.3281, -0.7656, 0.7364, 0.6521, -0.1803, -0.5000, 0.3906, -0.6875, -0.6098, 0.4922, -0.6211, -0.4375, 0.3281, -0.7656, -0.7162, 0.6771, -0.1692, 0.5000, 0.3906, -0.6875, 0.6102, 0.4956, -0.6181, -0.5469, 0.4375, -0.5781, -0.6727, 0.5347, -0.5114, 0.5469, 0.4375, -0.5781, 0.6682, 0.5371, -0.5148, -0.4688, 0.2422, -0.7578, -0.9706, -0.0152, -0.2402, 0.4766, 0.2422, -0.7734, 0.9644, -0.0127, -0.2639, -0.4453, 0.3359, -0.7812, -0.7179, 0.6582, -0.2264, 0.4453, 0.3359, -0.7812, 0.7216, 0.6556, -0.2224, -0.3516, 0.3750, -0.8047, -0.0416, 0.9387, -0.3422, 0.2656, 0.3359, -0.8203, -0.6071, 0.6448, -0.4644, -0.2656, 0.3359, -0.8203, 0.6237, 0.6285, -0.4647, 0.2266, 0.2422, -0.8203, -0.9239, -0.0133, -0.3824, -0.2266, 0.2422, -0.8203, 0.9270, -0.0129, -0.3749, -0.2656, 0.1562, -0.8203, 0.6159, -0.6366, -0.4641, 0.2656, 0.1562, -0.8203, -0.5992, -0.6524, -0.4640, -0.3516, 0.1172, -0.8047, -0.0410, -0.9401, -0.3383, 0.4453, 0.1562, -0.7812, 0.7152, -0.6625, -0.2227, -0.4453, 0.1562, -0.7812, -0.7106, -0.6658, -0.2274, -0.4766, 0.2422, -0.7734, -0.9626, -0.0113, -0.2707, 0.3516, 0.2422, -0.8281, 0.1836, -0.0053, -0.9830, -0.3516, 0.2422, -0.8281, -0.1836, -0.0053, -0.9830, 0.3516, 0.1172, -0.8047, 0.0318, -0.9414, -0.3357, 0.3516, 0.3750, -0.8047, 0.0323, 0.9399, -0.3397, 0.1797, -0.9688, -0.5547, 0.1596, -0.9752, -0.1529, 0.1641, -0.9297, -0.6328, 0.1554, -0.7590, -0.6323, 0.0000, -0.9844, -0.5781, -0.0205, -0.9692, -0.2452, 0.0000, -0.9453, -0.6406, -0.0179, -0.7709, -0.6367, -0.1641, -0.9297, -0.6328, -0.1461, -0.7887, -0.5971, -0.1797, -0.9688, -0.5547, -0.1472, -0.9781, -0.1474, 0.3281, -0.9453, -0.5234, 0.5267, -0.8347, -0.1611, 0.2344, -0.9141, -0.6328, 0.3502, -0.6391, -0.6847, -0.2344, -0.9141, -0.6328, -0.3578, -0.6333, -0.6862, -0.3281, -0.9453, -0.5234, -0.6239, -0.7772, -0.0817, 0.3672, -0.8906, -0.5312, 0.9457, -0.2579, -0.1977, 0.2656, -0.8203, -0.6641, 0.5557, -0.2264, -0.8000, -0.2656, -0.8203, -0.6641, -0.5315, -0.2379, -0.8130, 0.3516, -0.6953, -0.5703, 0.9728, 0.1003, -0.2087, 0.2500, -0.7031, -0.6875, 0.5652, -0.0297, -0.8244, -0.2500, -0.7031, -0.6875, -0.5566, -0.0457, -0.8295, -0.3672, -0.8906, -0.5312, -0.9384, -0.3451, -0.0143, 0.3125, -0.4375, -0.5703, 0.9557, 0.2492, -0.1565, 0.2109, -0.4453, -0.7109, 0.5937, 0.1082, -0.7974, -0.2109, -0.4453, -0.7109, -0.5704, 0.0751, -0.8179, -0.3516, -0.6953, -0.5703, -0.9782, 0.0801, -0.1917, 0.2031, -0.1875, -0.5625, 0.8915, -0.3307, -0.3095, 0.4375, -0.1406, -0.5312, 0.3488, -0.9371, 0.0081, 0.3984, -0.0469, -0.6719, 0.3411, -0.5510, -0.7616, -0.3984, -0.0469, -0.6719, -0.4388, -0.5190, -0.7335, -0.4375, -0.1406, -0.5312, -0.3383, -0.9407, 0.0250, -0.1250, -0.1016, -0.8125, -0.0238, -0.2265, -0.9737, 0.6328, -0.0391, -0.5391, 0.5875, -0.7849, -0.1970, -0.6172, 0.0547, -0.6250, -0.4817, -0.3736, -0.7927, -0.6328, -0.0391, -0.5391, -0.5811, -0.7812, -0.2279, 0.8281, 0.1484, -0.4453, 0.9070, -0.4009, 0.1289, 0.7266, 0.2031, -0.6016, 0.5665, -0.3188, -0.7598, -0.7266, 0.2031, -0.6016, -0.5989, -0.2850, -0.7483, -0.8281, 0.1484, -0.4453, -0.9118, -0.3861, 0.1399, 0.8594, 0.4297, -0.5938, 0.8451, 0.4434, -0.2985, -0.7422, 0.3750, -0.6562, -0.4371, -0.4690, -0.7674, -0.8594, 0.4297, -0.5938, -0.8837, 0.3928, -0.2543, 0.7109, 0.4844, -0.6250, 0.5170, 0.8291, -0.2125, 0.7422, 0.3750, -0.6562, 0.4607, -0.1448, -0.8756, -0.6875, 0.4141, -0.7266, -0.3790, -0.1825, -0.9072, -0.7109, 0.4844, -0.6250, -0.4349, 0.8866, -0.1574, 0.4922, 0.6016, -0.6875, 0.5976, 0.7847, -0.1646, 0.6875, 0.4141, -0.7266, 0.4801, -0.1833, -0.8578, -0.4375, 0.5469, -0.7969, -0.3127, -0.0113, -0.9498, -0.4922, 0.6016, -0.6875, -0.6023, 0.7813, -0.1636, 0.3203, 0.7578, -0.7344, 0.2247, 0.9601, -0.1662, 0.3125, 0.6406, -0.8359, 0.2699, 0.2137, -0.9388, -0.3125, 0.6406, -0.8359, -0.2538, 0.2144, -0.9432, -0.3203, 0.7578, -0.7344, -0.2255, 0.9589, -0.1721, 0.1562, 0.7187, -0.7578, -0.5952, 0.7791, -0.1968, 0.2031, 0.6172, -0.8516, -0.1274, 0.1700, -0.9771, -0.2031, 0.6172, -0.8516, 0.1609, 0.1534, -0.9750, -0.1562, 0.7187, -0.7578, 0.6051, 0.7680, -0.2098, 0.0625, 0.4922, -0.7500, -0.8108, 0.5623, -0.1623, 0.1016, 0.4297, -0.8438, -0.0553, -0.0432, -0.9975, -0.1016, 0.4297, -0.8438, 0.0293, -0.1579, -0.9870, -0.0625, 0.4922, -0.7500, 0.8242, 0.5468, -0.1473, 0.0000, 0.4297, -0.7422, -0.0584, 0.9485, -0.3114, 0.0000, 0.3516, -0.8203, -0.0323, -0.0563, -0.9979, 0.1641, 0.4141, -0.7734, 0.3572, -0.2743, -0.8928, 0.2500, 0.4687, -0.7578, 0.2633, -0.1145, -0.9579, -0.2500, 0.4687, -0.7578, -0.2180, -0.1231, -0.9681, -0.1641, 0.4141, -0.7734, -0.2898, -0.2241, -0.9304, 0.3281, 0.4766, -0.7422, 0.1490, -0.1541, -0.9767, -0.3281, 0.4766, -0.7422, -0.1442, -0.1598, -0.9766, 0.4297, 0.4375, -0.7188, 0.2190, 0.0371, -0.9750, 0.4375, 0.5469, -0.7969, 0.3085, 0.0038, -0.9512, 0.6016, 0.3750, -0.6641, 0.2254, -0.3608, -0.9050, -0.4297, 0.4375, -0.7188, -0.1943, 0.0657, -0.9787, 0.6406, 0.2969, -0.6484, 0.3588, -0.1192, -0.9257, -0.6016, 0.3750, -0.6641, -0.2447, -0.3607, -0.9000, 0.6250, 0.1875, -0.6484, 0.4602, -0.1651, -0.8723, -0.6406, 0.2969, -0.6484, -0.3562, -0.1236, -0.9262, 0.4922, 0.0625, -0.6719, 0.4305, -0.3617, -0.8269, 0.6172, 0.0547, -0.6250, 0.5001, -0.3758, -0.7802, -0.4922, 0.0625, -0.6719, -0.4216, -0.4031, -0.8122, 0.3750, 0.0156, -0.7031, 0.1637, -0.5078, -0.8458, 0.2031, 0.0937, -0.7422, -0.1553, -0.3230, -0.9335, 0.1250, -0.1016, -0.8125, 0.0559, -0.2297, -0.9716, -0.3750, 0.0156, -0.7031, -0.3458, -0.3722, -0.8613, 0.1641, 0.1406, -0.7500, -0.2965, -0.2673, -0.9168, 0.0000, 0.0469, -0.7266, 0.0038, 0.0699, -0.9975, -0.1641, 0.1406, -0.7500, 0.2393, -0.3012, -0.9230, -0.2031, 0.0937, -0.7422, 0.1823, -0.2533, -0.9500, 0.1250, 0.3047, -0.7656, 0.0360, -0.2032, -0.9785, 0.0000, 0.2109, -0.7656, 0.0446, -0.2602, -0.9645, -0.1328, 0.2109, -0.7578, 0.1646, -0.1727, -0.9711, 0.1328, 0.2109, -0.7578, -0.1938, -0.1490, -0.9696, 0.0625, -0.8828, -0.6953, -0.0402, -0.3406, -0.9393, 0.0000, -0.8906, -0.6875, -0.0466, -0.3789, -0.9243, 0.1172, -0.8359, -0.7109, 0.1083, -0.3252, -0.9394, -0.0625, -0.8828, -0.6953, 0.0893, -0.4239, -0.9013, 0.1094, -0.7188, -0.7344, 0.1461, -0.1193, -0.9820, -0.1172, -0.8359, -0.7109, -0.1950, -0.2758, -0.9412, -0.1094, -0.7188, -0.7344, -0.1568, -0.1334, -0.9785, 0.0781, -0.4453, -0.7500, 0.1344, 0.0067, -0.9909, 0.1172, -0.6875, -0.7344, 0.1817, -0.0454, -0.9823, -0.1172, -0.6875, -0.7344, -0.1928, -0.0461, -0.9801, -0.0781, -0.4453, -0.7500, -0.1335, -0.0018, -0.9910, 0.0859, -0.2891, -0.7422, 0.5003, -0.4292, -0.7519, 0.0000, -0.3281, -0.7422, -0.0068, -0.4701, -0.8826, 0.0000, -0.4453, -0.7500, -0.0003, 0.0004, -1.0000, 0.0000, -0.6797, -0.7344, -0.0002, -0.0344, -0.9994, 0.0000, -0.7656, -0.7344, -0.0384, -0.5979, -0.8006, 0.1250, -0.2266, -0.7500, 0.8061, -0.3932, -0.4421, 0.1328, -0.2266, -0.7969, 0.9262, -0.2430, -0.2880, 0.0938, -0.2734, -0.7812, 0.5836, -0.6929, -0.4235, -0.0938, -0.2734, -0.7812, -0.5287, -0.7138, -0.4592, -0.1328, -0.2266, -0.7969, -0.9303, -0.2210, -0.2926, -0.0859, -0.2891, -0.7422, -0.4317, -0.4659, -0.7724, 0.1016, -0.1484, -0.7422, 0.0032, 0.1752, -0.9845, 0.1094, -0.1328, -0.7812, 0.6186, 0.7757, -0.1248, -0.1094, -0.1328, -0.7812, -0.6276, 0.7712, -0.1065, -0.1016, -0.1484, -0.7422, -0.0107, 0.0912, -0.9958, 0.0000, -0.1406, -0.7422, 0.0664, 0.3602, -0.9305, 0.0391, -0.1250, -0.7812, -0.2936, 0.9400, -0.1735, -0.0391, -0.1250, -0.7812, 0.2391, 0.9534, -0.1840, 0.0000, -0.1953, -0.7500, 0.1722, 0.8255, -0.5374, 0.0000, -0.1875, -0.7969, -0.0265, 0.9120, -0.4093, 0.0000, -0.3203, -0.7812, -0.0088, -0.8681, -0.4964, 0.0000, -0.2891, -0.8047, 0.0000, -0.5222, -0.8528, -0.0781, -0.2500, -0.8047, -0.3870, -0.7462, -0.5416, 0.0000, -0.2031, -0.8281, -0.0063, 0.1920, -0.9814, -0.0469, -0.1484, -0.8125, 0.1976, 0.5896, -0.7831, 0.0469, -0.1484, -0.8125, -0.1333, 0.5965, -0.7914, 0.0938, -0.1563, -0.8125, 0.3611, 0.4713, -0.8047, -0.0938, -0.1563, -0.8125, -0.3647, 0.4640, -0.8073, -0.1094, -0.2266, -0.8281, -0.4917, -0.2875, -0.8219, 0.1094, -0.2266, -0.8281, 0.4931, -0.2846, -0.8220, 0.0781, -0.2500, -0.8047, 0.3870, -0.7462, -0.5416, -0.1641, -0.2422, -0.7109, -0.8366, 0.0461, -0.5458, -0.1250, -0.2266, -0.7500, -0.8196, -0.2792, -0.5003, 0.1641, -0.2422, -0.7109, 0.7995, 0.0044, -0.6006, -0.1797, -0.3125, -0.7109, -0.6554, 0.1339, -0.7432, 0.1797, -0.3125, -0.7109, 0.6507, 0.1487, -0.7447, 0.2578, -0.3125, -0.5547, 0.9278, 0.3530, -0.1209, -0.2578, -0.3125, -0.5547, -0.9228, 0.3715, -0.1019, -0.3125, -0.4375, -0.5703, -0.9636, 0.2327, -0.1312, 0.2344, -0.2500, -0.5547, 0.9306, 0.3435, -0.1263, -0.2344, -0.2500, -0.5547, -0.9289, 0.3610, -0.0820, 0.0938, -0.7422, -0.7266, -0.1468, -0.5234, -0.8394, 0.0000, -0.7734, -0.7187, -0.0194, -0.9571, -0.2891, 0.0938, -0.8203, -0.7109, -0.6332, -0.0002, -0.7740, -0.0938, -0.7422, -0.7266, 0.2008, -0.4711, -0.8589, 0.0469, -0.8672, -0.6875, -0.3669, 0.6037, -0.7077, -0.0938, -0.8203, -0.7109, 0.6351, 0.0428, -0.7712, 0.0000, -0.8750, -0.6875, -0.0381, 0.5754, -0.8169, -0.0469, -0.8672, -0.6875, 0.4141, 0.5798, -0.7016, 0.0469, -0.8516, -0.6328, -0.3245, 0.4755, -0.8177, -0.0469, -0.8516, -0.6328, 0.2900, 0.4687, -0.8343, 0.0000, -0.8594, -0.6328, 0.0044, 0.5304, -0.8477, -0.0938, -0.8125, -0.6406, 0.6738, 0.1155, -0.7299, 0.0938, -0.8125, -0.6406, -0.6715, 0.1450, -0.7267, -0.0938, -0.7500, -0.6641, 0.5168, -0.7037, -0.4875, 0.0938, -0.7500, -0.6641, -0.5177, -0.7041, -0.4860, 0.0000, -0.7812, -0.6562, 0.0046, -0.6963, -0.7177, 0.1719, 0.2187, -0.7812, 0.1182, -0.0594, -0.9912, -0.1875, 0.1562, -0.7734, 0.0103, -0.0716, -0.9974, 0.1797, 0.2969, -0.7812, 0.2781, -0.1122, -0.9539, -0.1719, 0.2187, -0.7812, -0.1586, -0.0802, -0.9841, -0.1250, 0.3047, -0.7656, -0.0843, -0.0546, -0.9949, -0.1797, 0.2969, -0.7812, -0.2715, -0.0865, -0.9586, -0.2109, 0.3750, -0.7812, -0.1558, -0.0818, -0.9844, 0.2266, 0.1094, -0.7812, -0.0239, -0.1866, -0.9821, -0.2266, 0.1094, -0.7812, 0.0688, -0.1757, -0.9820, -0.3750, 0.0625, -0.7422, -0.2432, -0.1762, -0.9538, 0.4766, 0.1016, -0.7188, 0.3072, -0.0162, -0.9515, -0.4766, 0.1016, -0.7188, -0.2661, -0.0486, -0.9627, 0.5781, 0.1953, -0.6797, 0.2781, -0.0927, -0.9561, -0.5781, 0.1953, -0.6797, -0.2977, -0.0310, -0.9541, -0.6250, 0.1875, -0.6484, -0.4833, -0.2039, -0.8513, 0.5859, 0.2891, -0.6875, 0.1638, -0.0697, -0.9840, -0.5859, 0.2891, -0.6875, -0.1819, -0.0705, -0.9808, -0.5625, 0.3516, -0.6953, -0.3223, -0.0972, -0.9416, 0.5625, 0.3516, -0.6953, 0.2816, -0.0011, -0.9595, -0.4219, 0.3984, -0.7734, -0.0553, -0.1278, -0.9902, 0.3359, 0.4297, -0.7578, 0.1723, 0.1345, -0.9758, -0.3359, 0.4297, -0.7578, -0.1907, 0.1022, -0.9763, 0.2734, 0.4219, -0.7734, 0.1514, 0.0618, -0.9865, -0.2734, 0.4219, -0.7734, -0.1550, 0.1021, -0.9826, 0.2109, 0.3750, -0.7812, 0.2021, -0.1124, -0.9729, 0.2344, 0.3594, -0.7578, 0.4634, -0.3949, -0.7932, -0.2344, 0.3594, -0.7578, -0.5008, -0.4443, -0.7428, -0.2812, 0.3984, -0.7656, -0.3007, -0.2641, -0.9164, 0.2812, 0.3984, -0.7656, 0.1744, -0.2683, -0.9474, -0.3359, 0.4062, -0.7500, -0.0996, -0.3046, -0.9472, 0.4219, 0.3984, -0.7734, 0.1811, -0.1429, -0.9730, 0.3359, 0.4062, -0.7500, 0.0001, -0.3783, -0.9257, -0.4141, 0.3906, -0.7500, 0.2741, -0.8556, -0.4391, 0.4141, 0.3906, -0.7500, -0.1395, -0.9154, -0.3776, -0.5312, 0.3359, -0.6797, 0.1423, -0.5826, -0.8002, 0.5547, 0.2812, -0.6719, -0.3840, -0.1351, -0.9134, -0.5547, 0.2812, -0.6719, 0.4229, -0.1078, -0.8997, -0.5469, 0.2109, -0.6719, 0.1921, 0.1914, -0.9625, 0.4609, 0.1172, -0.7031, -0.1242, 0.6164, -0.7775, 0.3750, 0.0625, -0.7422, 0.2286, -0.1674, -0.9590, 0.3750, 0.0859, -0.7266, 0.1431, 0.5587, -0.8169, -0.4609, 0.1172, -0.7031, 0.1653, 0.6098, -0.7751, -0.3750, 0.0859, -0.7266, -0.1564, 0.5646, -0.8104, 0.2422, 0.1250, -0.7578, 0.4323, 0.5833, -0.6876, 0.1875, 0.1562, -0.7734, -0.0438, 0.0069, -0.9990, -0.2422, 0.1250, -0.7578, -0.4197, 0.6008, -0.6803, -0.2031, 0.1719, -0.7500, -0.6920, 0.2958, -0.6585, 0.1953, 0.2969, -0.7578, 0.7894, -0.2032, -0.5793, -0.1953, 0.2969, -0.7578, -0.7938, -0.2865, -0.5364, 0.1953, 0.2266, -0.7500, 0.8016, 0.0110, -0.5977, -0.1953, 0.2266, -0.7500, -0.7987, 0.0194, -0.6014, 0.2031, 0.1719, -0.7500, 0.6880, 0.2985, -0.6614, 0.0000, 0.4062, -0.6016, -0.0345, 0.8722, -0.4879, -0.1094, 0.4609, -0.6094, 0.5870, 0.7351, -0.3391, 0.1094, 0.4609, -0.6094, -0.4285, 0.8853, -0.1808, -0.1953, 0.6641, -0.6172, 0.4766, 0.5094, 0.7164, 0.3359, 0.6875, -0.5938, 0.1150, 0.6553, 0.7466, -0.3359, 0.6875, -0.5938, -0.1169, 0.6457, 0.7545, -0.4844, 0.5547, -0.5547, -0.2746, 0.8880, 0.3688, 0.4844, 0.5547, -0.5547, 0.2275, 0.8745, 0.4283, -0.6797, 0.4531, -0.4922, -0.3626, 0.9120, 0.1919, 0.7969, 0.4062, -0.4609, 0.6957, 0.5814, 0.4218, -0.7969, 0.4062, -0.4609, -0.7391, 0.6070, 0.2920, -0.7734, 0.1641, -0.3750, -0.8565, -0.4709, 0.2113, 0.6016, -0.0000, -0.4141, 0.5443, -0.8372, 0.0533, -0.6016, -0.0000, -0.4141, -0.6261, -0.7782, 0.0493, 0.4375, -0.0938, -0.4688, 0.4720, -0.8637, 0.1768, -0.4375, -0.0938, -0.4688, -0.3676, -0.9095, 0.1939, 0.0000, -0.5703, -0.3203, 0.0226, -0.2705, 0.9624, 0.0000, -0.4844, -0.2812, 0.0819, -0.7395, 0.6681, 0.1250, -0.5391, -0.3594, 0.2771, -0.3147, 0.9078, -0.1797, -0.4141, -0.2578, -0.6095, -0.7764, 0.1601, 0.0000, -0.8047, -0.3437, -0.0570, -0.3260, 0.9436, 0.1406, -0.7578, -0.3672, 0.2050, -0.1864, 0.9608, -0.1250, -0.5391, -0.3594, -0.4085, -0.2920, 0.8648, 0.0000, -0.9766, -0.4609, -0.0479, -0.8737, 0.4840, 0.1641, -0.9453, -0.4375, 0.0963, -0.7572, 0.6460, -0.1406, -0.7578, -0.3672, -0.1179, -0.1639, 0.9794, -0.1641, -0.9453, -0.4375, -0.0110, -0.7755, 0.6312, -0.3281, -0.9141, -0.3984, -0.6665, -0.4385, 0.6029, 0.3281, -0.9141, -0.3984, 0.5130, -0.4512, 0.7302, -0.2891, -0.7109, -0.3828, -0.6281, 0.0925, 0.7726, 0.2891, -0.7109, -0.3828, 0.6053, 0.0333, 0.7953, -0.2500, -0.5000, -0.3906, -0.6249, 0.1224, 0.7710, 0.2344, -0.3516, -0.4062, 0.8957, 0.2577, 0.3624, 0.2500, -0.5000, -0.3906, 0.7798, -0.0105, 0.6258, 0.1797, -0.4141, -0.2578, 0.6893, -0.6687, 0.2786, -0.2344, -0.3516, -0.4062, -0.9439, 0.1056, 0.3129, 0.2188, -0.2813, -0.4297, 0.9787, -0.1958, -0.0615, -0.2109, -0.2266, -0.4688, -0.9562, -0.1362, -0.2589, -0.2188, -0.2813, -0.4297, -0.9982, 0.0183, -0.0565, 0.2031, -0.1719, -0.5000, 0.7857, -0.5715, -0.2367, -0.2031, -0.1875, -0.5625, -0.9361, -0.3368, -0.1016, -0.2031, -0.1719, -0.5000, -0.7526, -0.5911, -0.2901, 0.0000, 0.0703, 0.8281, -0.0265, -0.2849, 0.9582, 0.3359, 0.0547, 0.6641, 0.4455, -0.3583, 0.8204, 0.0000, -0.1953, 0.6719, -0.0037, -0.6934, 0.7205, -0.3438, -0.1484, 0.5391, -0.5264, -0.6594, 0.5367, -0.3359, 0.0547, 0.6641, -0.4404, -0.3208, 0.8385, 0.3438, -0.1484, 0.5391, 0.5223, -0.6536, 0.5477, 0.0000, -0.3828, 0.3516, -0.0040, -0.9391, 0.3435, -0.2969, -0.3125, 0.2656, -0.5017, -0.8333, 0.2320, 0.2969, -0.3125, 0.2656, 0.5071, -0.8376, 0.2033, 0.2109, -0.3906, -0.1641, 0.5727, -0.8197, -0.0120, -0.2109, -0.3906, -0.1641, -0.5747, -0.8183, -0.0009, 0.0000, -0.4609, -0.1875, 0.0134, -0.9822, 0.1874, 0.7734, 0.1641, -0.3750, 0.9302, -0.3062, 0.2023, 0.7344, -0.0469, -0.0703, 0.7210, -0.6898, -0.0651, -0.7344, -0.0469, -0.0703, -0.7504, -0.6502, -0.1191, -0.8516, 0.2344, -0.0547, -0.9855, -0.1614, -0.0522, 0.0000, 0.5625, 0.8516, -0.0007, 0.3401, 0.9404, 0.4609, 0.4375, 0.7031, 0.4730, 0.1763, 0.8632, -0.4609, 0.4375, 0.7031, -0.5126, 0.1686, 0.8419, 0.0000, 0.8984, -0.2891, 0.0226, 0.8392, -0.5434, 0.4531, 0.8516, -0.2344, 0.4442, 0.7244, -0.5271, 0.0000, 0.9844, 0.0781, 0.0039, 0.9997, -0.0222, -0.4531, 0.9297, 0.0703, -0.4288, 0.9025, -0.0398, -0.4531, 0.8516, -0.2344, -0.4798, 0.7182, -0.5040, 0.4531, 0.9297, 0.0703, 0.4135, 0.9096, -0.0395, 0.4531, 0.8672, 0.3828, 0.3912, 0.8153, 0.4268, -0.4531, 0.8672, 0.3828, -0.4265, 0.7997, 0.4225, 0.0000, 0.8984, 0.5469, 0.0172, 0.8404, 0.5417, 0.6797, 0.4531, -0.4922, 0.3455, 0.9124, 0.2191, 0.7266, 0.4062, -0.3359, 0.7831, 0.6136, -0.1011, -0.7266, 0.4062, -0.3359, -0.6092, 0.7911, 0.0546, -0.6328, 0.4531, -0.2813, -0.4234, 0.8153, -0.3949, 0.6328, 0.4531, -0.2813, 0.3760, 0.7903, -0.4836, 0.6406, 0.7031, -0.0547, 0.6639, 0.6793, -0.3127, -0.7969, 0.5625, -0.1250, -0.7631, 0.4966, -0.4136, 0.7969, 0.5625, -0.1250, 0.7705, 0.5058, -0.3880, 0.7969, 0.6172, 0.1172, 0.8486, 0.5288, 0.0140, -0.7969, 0.6172, 0.1172, -0.8678, 0.4968, -0.0030, -0.6406, 0.7500, 0.1953, -0.6595, 0.7481, 0.0733, 0.6406, 0.7500, 0.1953, 0.6784, 0.7314, 0.0695, 0.7969, 0.5391, 0.3594, 0.8722, 0.3146, 0.3746, -0.7969, 0.5391, 0.3594, -0.8935, 0.2545, 0.3698, -0.6406, 0.6797, 0.4453, -0.4986, 0.5502, 0.6698, 0.7734, 0.2656, 0.4375, 0.7831, -0.1485, 0.6038, 0.6172, 0.3281, 0.5859, 0.6196, -0.0605, 0.7825, -0.6172, 0.3281, 0.5859, -0.6099, -0.0221, 0.7921, -0.7734, 0.2656, 0.4375, -0.6664, -0.0202, 0.7453, 0.6406, 0.6797, 0.4453, 0.6075, 0.5696, 0.5536, -0.6406, 0.7031, -0.0547, -0.6593, 0.6777, -0.3254, 0.4609, 0.5234, -0.4297, 0.3406, 0.8832, -0.3223, -0.4609, 0.5234, -0.4297, -0.3645, 0.9029, -0.2280, 0.0000, 0.5703, -0.5703, 0.0518, 0.5225, -0.8510, 0.1953, 0.6641, -0.6172, -0.4701, 0.5252, 0.7093, 0.8516, 0.2344, -0.0547, 0.9850, -0.1605, -0.0631, 0.8594, 0.3203, 0.0469, 0.9970, -0.0333, 0.0695, -0.8594, 0.3203, 0.0469, -0.9979, 0.0404, 0.0497, 0.8203, 0.3281, 0.2031, 0.9144, 0.2312, -0.3323, -0.8203, 0.3281, 0.2031, -0.8007, 0.5628, -0.2050, 0.4062, -0.1719, -0.1484, 0.5790, -0.8027, -0.1427, -0.4297, -0.1953, 0.2109, -0.5968, -0.7859, 0.1618, 0.5938, -0.1250, 0.1641, 0.3105, -0.9506, -0.0010, -0.4062, -0.1719, -0.1484, -0.5673, -0.8083, -0.1575, 0.2109, -0.2266, -0.4688, 0.8872, -0.1577, -0.4336, 0.6406, -0.0078, 0.4297, 0.3535, -0.5927, 0.7237, -0.4844, 0.0234, 0.5469, -0.5421, -0.4993, 0.6759, -0.6406, -0.0078, 0.4297, -0.2692, -0.6315, 0.7272, 0.4297, -0.1953, 0.2109, 0.5633, -0.8173, 0.1213, -0.5938, -0.1250, 0.1641, -0.2785, -0.9594, 0.0447, 0.4844, 0.0234, 0.5469, 0.5292, -0.5051, 0.6817, 1.0234, 0.4766, 0.3125, -0.0199, 0.8803, -0.4740, 0.8906, 0.4062, 0.2344, -0.2911, 0.7817, -0.5516, 1.0156, 0.4141, 0.2891, 0.5512, -0.0788, -0.8306, -0.9219, 0.3594, 0.2187, -0.4461, -0.0227, -0.8947, -0.8906, 0.4062, 0.2344, 0.3026, 0.7616, -0.5731, -1.0234, 0.4766, 0.3125, -0.0005, 0.8798, -0.4753, 1.1875, 0.4375, 0.3906, 0.3214, -0.0922, -0.9424, -1.1875, 0.4375, 0.3906, -0.3912, -0.1216, -0.9122, -1.0156, 0.4141, 0.2891, -0.5720, -0.1149, -0.8122, -1.2344, 0.5078, 0.4219, -0.3940, 0.8547, -0.3380, 1.2344, 0.5078, 0.4219, 0.3552, 0.8790, -0.3179, 1.3516, 0.3203, 0.4219, 0.7788, 0.1678, -0.6044, -1.2656, 0.2891, 0.4062, 0.1568, -0.0805, -0.9843, 1.2656, 0.2891, 0.4062, -0.1523, -0.1211, -0.9809, 1.2812, 0.0547, 0.4297, 0.6526, -0.4768, -0.5888, -1.2109, 0.0781, 0.4062, 0.0469, 0.3680, -0.9286, -1.3516, 0.3203, 0.4219, -0.7626, 0.1751, -0.6227, 1.2109, 0.0781, 0.4062, -0.0400, 0.3039, -0.9518, 1.0391, -0.1016, 0.3281, 0.5029, -0.7810, -0.3703, -1.0312, -0.0391, 0.3047, -0.4992, 0.2890, -0.8168, -1.2812, 0.0547, 0.4297, -0.6804, -0.4264, -0.5960, 1.0312, -0.0391, 0.3047, 0.5089, 0.3211, -0.7987, 0.8281, -0.0703, 0.1328, 0.3409, 0.3183, -0.8845, -0.8281, -0.0703, 0.1328, -0.3488, 0.2273, -0.9092, -0.7734, -0.1406, 0.1250, -0.0394, -0.6351, -0.7714, 1.0391, 0.0000, 0.3672, -0.1831, 0.9556, -0.2307, -0.8828, -0.0234, 0.2109, -0.2527, 0.8501, -0.4620, -1.0391, 0.0000, 0.3672, 0.1868, 0.9538, -0.2351, 1.1875, 0.0938, 0.4453, -0.8095, 0.5847, 0.0524, -1.1875, 0.0938, 0.4453, 0.7621, 0.6471, 0.0193, 1.2344, 0.2500, 0.4453, -0.9931, -0.0552, -0.1035, -1.2344, 0.2500, 0.4453, 0.9847, -0.0996, -0.1426, 1.1719, 0.3594, 0.4375, -0.1439, -0.7537, -0.6413, -1.1719, 0.3594, 0.4375, 0.1333, -0.7504, -0.6474, 1.0234, 0.3438, 0.3594, 0.5604, -0.6609, -0.4991, -1.0234, 0.3438, 0.3594, -0.5585, -0.6545, -0.5096, 0.9219, 0.3594, 0.2187, 0.4492, -0.0383, -0.8926, 0.9453, 0.3047, 0.2891, 0.6842, -0.5558, -0.4722, -0.9453, 0.3047, 0.2891, -0.7274, -0.5127, -0.4560, 0.7266, 0.0000, 0.0703, 0.8572, -0.4931, 0.1483, -0.7188, -0.0234, 0.1719, -0.7341, 0.1288, -0.6667, 0.7734, -0.1406, 0.1250, 0.0381, -0.6438, -0.7642, -0.7266, 0.0000, 0.0703, -0.9710, -0.2035, 0.1250, 0.8438, 0.2891, 0.2109, 0.3727, -0.2242, -0.9004, -0.8438, 0.2891, 0.2109, -0.7723, -0.2654, -0.5771, 0.8828, -0.0234, 0.2109, 0.2435, 0.8170, -0.5227, 0.8125, -0.0156, 0.2734, 0.5998, 0.5131, -0.6139, -0.8125, -0.0156, 0.2734, -0.7615, 0.4580, -0.4586, 0.8438, 0.0156, 0.2734, 0.8420, -0.1762, -0.5098, 0.7188, 0.0391, 0.1875, 0.9609, -0.1188, -0.2499, -0.7188, 0.0391, 0.1875, -0.9344, -0.0891, -0.3448, -0.8438, 0.0156, 0.2734, -0.8754, -0.1836, -0.4472, 0.7578, 0.0938, 0.2734, 0.8515, 0.0414, -0.5228, -0.8203, 0.0859, 0.2734, -0.5701, 0.7361, -0.3649, 0.8359, 0.1719, 0.2734, 0.6864, -0.6234, -0.3746, 0.7969, 0.2031, 0.2109, 0.8484, -0.4354, -0.3012, -0.7969, 0.2031, 0.2109, -0.8532, -0.4084, -0.3243, -0.8359, 0.1719, 0.2734, -0.7465, -0.5659, -0.3498, 0.8906, 0.2422, 0.2656, 0.7261, -0.4989, -0.4731, -0.8906, 0.2422, 0.2656, -0.6655, -0.5609, -0.4923, 0.7188, -0.0234, 0.1719, 0.7313, 0.1263, -0.6702, 0.8906, 0.2344, 0.3203, 0.6593, -0.4685, -0.5881, -0.8906, 0.2344, 0.3203, -0.6639, -0.4673, -0.5838, -0.9531, 0.2891, 0.3438, -0.6215, -0.4422, -0.6466, -0.8438, 0.1719, 0.3203, -0.5176, -0.4523, -0.7263, 0.7656, 0.0938, 0.3203, 0.7584, 0.2665, -0.5948, -0.7656, 0.0938, 0.3203, -0.7675, 0.2336, -0.5969, -0.7578, 0.0938, 0.2734, -0.9543, 0.1026, -0.2806, 0.8203, 0.0859, 0.2734, 0.4814, 0.6344, -0.6048, -0.8281, 0.0781, 0.3203, -0.4243, 0.4571, -0.7816, 0.8281, 0.0781, 0.3203, 0.4492, 0.3799, -0.8086, -0.8516, 0.0156, 0.3203, -0.6593, -0.3517, -0.6645, 0.8125, -0.0156, 0.3203, 0.6450, 0.3101, -0.6984, -0.8125, -0.0156, 0.3203, -0.7098, 0.3132, -0.6309, 0.8828, -0.0156, 0.2656, -0.0434, 0.9405, -0.3371, -0.8828, -0.0156, 0.2656, 0.0413, 0.9530, -0.3001, 0.9531, 0.2891, 0.3438, 0.6482, -0.4206, -0.6347, -1.0391, 0.3281, 0.4141, -0.5205, -0.2498, -0.8165, 1.0391, 0.3281, 0.4141, 0.4618, -0.3291, -0.8237, -1.1875, 0.3438, 0.4844, 0.2607, -0.5229, -0.8115, 1.2578, 0.2422, 0.4922, -0.7551, 0.0224, -0.6552, -1.2578, 0.2422, 0.4922, 0.7564, -0.0876, -0.6482, -1.2109, 0.0859, 0.4844, 0.5640, 0.5479, -0.6178, 1.2109, 0.0859, 0.4844, -0.6207, 0.4376, -0.6506, -1.0469, 0.0000, 0.4219, -0.0631, 0.7003, -0.7110, 0.8516, 0.0156, 0.3203, 0.2929, 0.3709, -0.8812, 0.8906, 0.1094, 0.3281, 0.1951, 0.0389, -0.9800, -0.9375, 0.0625, 0.3359, -0.3975, 0.1464, -0.9058, 0.9375, 0.0625, 0.3359, -0.1907, 0.5192, -0.8331, 0.9609, 0.1719, 0.3516, 0.3347, -0.0046, -0.9423, -1.0000, 0.1250, 0.3672, -0.4182, -0.0769, -0.9051, -0.8906, 0.1094, 0.3281, -0.1933, -0.0056, -0.9811, 1.0000, 0.1250, 0.3672, 0.4605, -0.0522, -0.8861, 1.0547, 0.1875, 0.3828, 0.3144, -0.1037, -0.9436, -1.0547, 0.1875, 0.3828, -0.3254, -0.1152, -0.9385, -1.0156, 0.2344, 0.3750, -0.2996, -0.0545, -0.9525, 1.0156, 0.2344, 0.3750, 0.3343, 0.1068, -0.9364, 1.0859, 0.2734, 0.3906, 0.2897, 0.3158, -0.9035, -1.1094, 0.2109, 0.3906, -0.4628, -0.3818, -0.8000, -1.0859, 0.2734, 0.3906, -0.3586, 0.3081, -0.8812, -0.9609, 0.1719, 0.3516, -0.3723, -0.0194, -0.9279, 0.8438, 0.1719, 0.3203, 0.5725, -0.4189, -0.7047, 1.0469, 0.0000, 0.4219, 0.1481, 0.7017, -0.6969, 1.1094, 0.2109, 0.3906, 0.3831, -0.0685, -0.9211, 1.1875, 0.3438, 0.4844, -0.2113, -0.5485, -0.8089, 0.7891, -0.1250, 0.3281, -0.1016, -0.8343, 0.5418, -0.7891, -0.1250, 0.3281, 0.0917, -0.8428, 0.5303, -1.0391, -0.0859, 0.4922, 0.0555, -0.6765, 0.7343, 1.0391, -0.0859, 0.4922, -0.0349, -0.6861, 0.7267, -1.0391, -0.1016, 0.3281, -0.4613, -0.7982, -0.3875, -1.3125, 0.0547, 0.5312, -0.6466, -0.4789, 0.5937, 1.3672, 0.2969, 0.5000, 0.9253, 0.0918, 0.3680, 1.2500, 0.4688, 0.5469, 0.2873, 0.6209, 0.7293, -1.3672, 0.2969, 0.5000, -0.9240, 0.0860, 0.3726, -1.2500, 0.4688, 0.5469, -0.2792, 0.5978, 0.7514, -1.0234, 0.4375, 0.4844, 0.4142, 0.5509, 0.7245, 1.0234, 0.4375, 0.4844, -0.4278, 0.5755, 0.6970, -0.8594, 0.3828, 0.3828, 0.6500, 0.5846, 0.4853, 1.3125, 0.0547, 0.5312, 0.6502, -0.5100, 0.5631, 0.8594, 0.3828, 0.3828, -0.6611, 0.5885, 0.4653, 0.6250, 0.2422, -0.5625, 0.8682, -0.0047, -0.4961, 0.1562, 0.0547, -0.6484, -0.5472, -0.6394, -0.5400, 0.5312, 0.3359, -0.6797, -0.1346, -0.5529, -0.8222, 0.5469, 0.2109, -0.6719, -0.1477, 0.1899, -0.9706 ], 48 | "indices": [ 0, 1, 2, 3, 4, 5, 6, 2, 7, 8, 3, 9, 2, 10, 11, 12, 13, 8, 1, 14, 10, 13, 15, 3, 14, 16, 10, 17, 18, 15, 10, 19, 11, 20, 17, 13, 19, 21, 22, 23, 24, 20, 16, 25, 21, 24, 26, 17, 25, 27, 21, 28, 29, 26, 21, 30, 31, 32, 28, 23, 30, 33, 34, 35, 36, 32, 27, 37, 33, 36, 38, 28, 37, 39, 33, 40, 41, 38, 33, 42, 34, 43, 40, 36, 42, 6, 44, 9, 5, 40, 39, 0, 42, 5, 45, 41, 0, 39, 46, 47, 41, 45, 39, 37, 48, 49, 38, 41, 37, 27, 50, 51, 29, 49, 27, 25, 52, 53, 26, 51, 25, 16, 52, 54, 18, 26, 16, 14, 55, 56, 15, 18, 14, 1, 57, 58, 4, 56, 1, 0, 46, 59, 45, 58, 60, 57, 46, 59, 58, 61, 62, 57, 60, 61, 58, 56, 60, 55, 62, 56, 54, 61, 60, 52, 55, 54, 53, 61, 60, 50, 52, 53, 51, 61, 60, 63, 50, 51, 49, 61, 60, 48, 63, 49, 47, 61, 60, 46, 48, 47, 59, 61, 64, 65, 66, 67, 68, 69, 70, 71, 64, 68, 72, 73, 74, 75, 71, 72, 76, 73, 77, 78, 75, 76, 79, 80, 81, 82, 78, 79, 83, 84, 85, 86, 87, 88, 89, 90, 86, 91, 87, 92, 93, 89, 91, 94, 95, 96, 97, 92, 94, 98, 95, 99, 100, 97, 98, 101, 102, 103, 104, 100, 101, 105, 106, 107, 108, 104, 105, 109, 110, 111, 112, 107, 109, 113, 114, 115, 116, 111, 113, 117, 118, 119, 120, 115, 117, 121, 122, 122, 121, 119, 123, 124, 118, 115, 125, 126, 124, 127, 110, 111, 128, 115, 129, 130, 127, 111, 107, 128, 131, 106, 129, 107, 103, 132, 133, 102, 131, 103, 99, 134, 135, 95, 133, 99, 96, 136, 137, 138, 135, 96, 92, 139, 140, 87, 138, 92, 88, 139, 141, 142, 87, 88, 90, 143, 141, 144, 145, 145, 146, 147, 123, 118, 148, 122, 119, 126, 148, 122, 149, 149, 122, 150, 145, 144, 151, 150, 146, 149, 152, 153, 67, 67, 153, 68, 154, 152, 65, 68, 155, 72, 156, 154, 75, 72, 157, 158, 82, 159, 160, 161, 162, 79, 156, 75, 78, 79, 76, 161, 163, 164, 159, 165, 164, 162, 160, 159, 165, 165, 162, 166, 167, 156, 166, 161, 158, 166, 168, 169, 170, 171, 172, 173, 174, 175, 168, 172, 176, 177, 178, 179, 174, 176, 180, 178, 181, 182, 179, 180, 182, 178, 164, 163, 183, 171, 173, 164, 183, 170, 184, 185, 171, 183, 182, 186, 179, 187, 186, 182, 179, 188, 189, 190, 187, 176, 175, 189, 169, 191, 190, 176, 169, 192, 193, 185, 191, 172, 186, 192, 188, 190, 191, 186, 186, 184, 192, 185, 184, 191, 178, 174, 142, 90, 177, 178, 174, 168, 142, 194, 195, 90, 168, 163, 196, 197, 173, 195, 163, 159, 198, 83, 162, 173, 81, 199, 82, 197, 200, 201, 199, 202, 198, 194, 203, 200, 85, 142, 196, 194, 90, 203, 156, 167, 204, 205, 167, 158, 154, 156, 206, 207, 158, 157, 152, 154, 208, 209, 157, 155, 153, 152, 210, 211, 155, 153, 210, 208, 212, 213, 211, 214, 208, 206, 212, 215, 209, 211, 206, 204, 216, 217, 207, 209, 204, 205, 218, 219, 205, 207, 219, 214, 212, 213, 214, 217, 218, 212, 216, 215, 213, 217, 151, 144, 220, 221, 146, 150, 148, 151, 222, 223, 150, 224, 123, 148, 222, 225, 224, 226, 144, 141, 227, 228, 147, 221, 141, 140, 227, 229, 143, 228, 140, 137, 230, 231, 139, 229, 137, 135, 232, 233, 234, 231, 135, 133, 235, 236, 136, 233, 133, 131, 235, 237, 134, 136, 131, 129, 238, 239, 132, 134, 129, 127, 240, 241, 128, 132, 127, 124, 242, 243, 125, 241, 124, 123, 242, 226, 126, 125, 242, 244, 245, 246, 226, 247, 240, 242, 248, 247, 243, 249, 250, 240, 251, 249, 241, 252, 238, 250, 253, 252, 239, 254, 235, 238, 255, 254, 237, 236, 232, 235, 255, 256, 236, 257, 230, 232, 258, 257, 233, 231, 259, 230, 260, 261, 231, 262, 227, 259, 263, 262, 229, 228, 264, 227, 263, 265, 228, 266, 244, 222, 267, 268, 225, 246, 222, 220, 269, 270, 223, 268, 220, 264, 271, 266, 221, 270, 121, 117, 272, 273, 120, 121, 117, 113, 274, 275, 116, 120, 113, 109, 276, 277, 112, 275, 109, 105, 276, 278, 108, 112, 105, 101, 279, 280, 104, 108, 101, 98, 281, 282, 100, 280, 98, 94, 281, 283, 97, 100, 94, 91, 284, 285, 93, 283, 91, 86, 286, 287, 89, 285, 288, 289, 290, 291, 289, 288, 292, 288, 293, 294, 288, 292, 295, 292, 296, 297, 292, 295, 64, 66, 295, 295, 66, 298, 70, 64, 296, 298, 69, 299, 74, 70, 300, 299, 73, 301, 77, 74, 302, 301, 80, 303, 302, 293, 290, 294, 297, 303, 302, 300, 296, 298, 299, 297, 304, 305, 306, 294, 303, 307, 81, 77, 305, 303, 84, 307, 199, 308, 202, 309, 310, 200, 81, 304, 199, 310, 307, 201, 85, 202, 311, 309, 203, 312, 85, 311, 86, 287, 313, 312, 314, 315, 316, 317, 318, 314, 316, 319, 320, 321, 317, 316, 320, 322, 323, 324, 321, 325, 325, 323, 306, 291, 324, 289, 304, 306, 308, 324, 291, 307, 326, 284, 327, 328, 285, 329, 330, 331, 314, 318, 332, 330, 333, 334, 335, 336, 337, 333, 335, 338, 339, 340, 336, 341, 341, 339, 331, 332, 340, 330, 342, 281, 343, 344, 282, 345, 346, 343, 347, 348, 344, 345, 347, 349, 350, 351, 348, 352, 353, 350, 354, 355, 351, 356, 357, 358, 354, 356, 359, 360, 331, 339, 361, 356, 340, 359, 339, 338, 353, 352, 336, 356, 338, 334, 347, 362, 337, 352, 334, 363, 346, 345, 364, 362, 279, 342, 363, 345, 280, 278, 365, 363, 333, 337, 364, 365, 274, 366, 276, 277, 275, 278, 274, 279, 363, 364, 278, 365, 272, 274, 365, 365, 273, 272, 281, 326, 343, 329, 283, 282, 367, 368, 349, 348, 369, 344, 368, 370, 350, 351, 371, 348, 357, 354, 370, 351, 355, 360, 323, 322, 372, 373, 321, 324, 327, 372, 374, 373, 375, 328, 284, 286, 372, 375, 287, 328, 286, 376, 308, 310, 309, 375, 308, 323, 372, 375, 324, 310, 286, 311, 376, 309, 313, 287, 357, 377, 358, 378, 379, 360, 331, 358, 315, 378, 359, 332, 374, 380, 377, 378, 373, 381, 322, 319, 380, 378, 317, 321, 315, 382, 319, 317, 378, 318, 383, 384, 385, 386, 387, 388, 383, 385, 389, 390, 391, 392, 393, 389, 394, 395, 390, 392, 394, 396, 397, 398, 395, 399, 397, 400, 401, 402, 398, 403, 401, 404, 405, 406, 402, 407, 404, 408, 405, 409, 410, 402, 400, 411, 404, 410, 412, 398, 396, 413, 411, 412, 414, 398, 389, 415, 413, 414, 416, 395, 385, 417, 389, 416, 418, 391, 385, 419, 420, 421, 386, 418, 327, 374, 422, 423, 381, 328, 374, 424, 405, 406, 407, 423, 367, 327, 422, 425, 328, 369, 370, 426, 419, 386, 427, 371, 405, 428, 429, 430, 409, 423, 431, 432, 429, 423, 433, 434, 435, 432, 431, 434, 433, 436, 437, 438, 435, 433, 439, 440, 426, 438, 441, 440, 439, 427, 419, 426, 420, 442, 427, 386, 368, 438, 370, 427, 439, 369, 368, 422, 438, 433, 425, 369, 422, 443, 432, 433, 423, 425, 420, 441, 444, 445, 442, 446, 441, 437, 444, 447, 440, 442, 437, 435, 448, 449, 450, 447, 435, 451, 448, 452, 436, 450, 451, 431, 453, 454, 434, 436, 431, 429, 455, 456, 430, 454, 429, 428, 457, 458, 409, 430, 417, 420, 459, 446, 421, 460, 415, 417, 461, 460, 418, 462, 413, 415, 463, 462, 416, 414, 411, 413, 463, 464, 414, 465, 408, 411, 466, 465, 412, 467, 428, 408, 457, 467, 410, 458, 453, 468, 469, 470, 454, 452, 469, 471, 472, 473, 470, 474, 472, 475, 476, 477, 473, 478, 479, 476, 480, 481, 477, 478, 461, 459, 479, 478, 446, 482, 444, 472, 459, 478, 483, 445, 444, 484, 472, 474, 447, 445, 453, 469, 484, 447, 474, 449, 455, 457, 468, 470, 458, 456, 485, 475, 457, 470, 473, 467, 466, 476, 485, 473, 477, 465, 463, 486, 466, 477, 481, 464, 487, 480, 486, 481, 482, 464, 461, 480, 487, 462, 482, 460, 401, 424, 488, 489, 407, 490, 397, 401, 491, 490, 492, 493, 394, 397, 494, 493, 403, 399, 393, 394, 495, 496, 399, 392, 383, 393, 495, 497, 392, 498, 384, 383, 499, 498, 388, 500, 499, 491, 488, 489, 490, 500, 499, 495, 491, 493, 497, 498, 495, 494, 501, 493, 496, 497, 357, 370, 384, 387, 371, 500, 357, 502, 377, 489, 500, 360, 374, 377, 488, 489, 379, 381, 6, 0, 2, 4, 45, 5, 503, 6, 7, 3, 5, 9, 7, 2, 11, 13, 3, 8, 2, 1, 10, 15, 4, 3, 16, 19, 10, 13, 17, 15, 19, 504, 11, 12, 20, 13, 504, 19, 22, 24, 17, 20, 19, 16, 21, 26, 18, 17, 27, 30, 21, 24, 28, 26, 22, 21, 31, 28, 24, 23, 31, 30, 34, 36, 28, 32, 30, 27, 33, 38, 29, 28, 39, 42, 33, 36, 40, 38, 42, 44, 34, 35, 43, 36, 6, 503, 44, 43, 9, 40, 0, 6, 42, 40, 5, 41, 39, 48, 46, 59, 47, 45, 37, 63, 48, 47, 49, 41, 63, 37, 50, 29, 38, 49, 50, 27, 52, 26, 29, 51, 16, 55, 52, 53, 54, 26, 14, 62, 55, 54, 56, 18, 62, 14, 57, 4, 15, 56, 57, 1, 46, 45, 4, 58, 65, 67, 66, 66, 67, 69, 71, 65, 64, 69, 68, 73, 70, 74, 71, 76, 80, 73, 74, 77, 75, 79, 84, 80, 77, 81, 78, 83, 201, 84, 142, 85, 87, 89, 312, 90, 91, 138, 87, 88, 92, 89, 138, 91, 95, 97, 93, 92, 98, 102, 95, 96, 99, 97, 101, 106, 102, 99, 103, 100, 105, 130, 106, 103, 107, 104, 130, 105, 110, 112, 108, 107, 110, 109, 114, 116, 112, 111, 114, 113, 118, 120, 116, 115, 118, 117, 122, 121, 120, 119, 124, 114, 118, 119, 115, 126, 114, 124, 110, 128, 125, 115, 130, 110, 127, 107, 132, 128, 106, 130, 129, 103, 134, 132, 102, 106, 131, 99, 136, 134, 95, 102, 133, 96, 234, 136, 138, 95, 135, 234, 96, 139, 137, 140, 138, 88, 143, 139, 140, 141, 87, 90, 147, 143, 142, 141, 145, 90, 145, 147, 118, 122, 148, 224, 122, 126, 151, 148, 149, 122, 224, 150, 149, 145, 151, 146, 145, 149, 65, 152, 67, 153, 155, 68, 71, 154, 65, 155, 157, 72, 154, 71, 75, 76, 72, 158, 78, 82, 160, 162, 83, 79, 160, 156, 78, 76, 158, 161, 164, 165, 159, 164, 173, 162, 166, 160, 165, 162, 161, 166, 156, 160, 166, 158, 167, 166, 163, 168, 170, 172, 195, 173, 175, 169, 168, 195, 172, 177, 179, 175, 174, 177, 176, 178, 178, 181, 179, 182, 181, 178, 163, 170, 183, 183, 171, 164, 170, 193, 184, 184, 185, 183, 186, 188, 179, 180, 187, 182, 175, 179, 189, 187, 180, 176, 189, 192, 169, 172, 191, 176, 170, 169, 193, 171, 185, 172, 192, 189, 188, 187, 190, 186, 184, 193, 192, 184, 186, 191, 145, 178, 142, 145, 90, 178, 168, 196, 142, 195, 177, 90, 163, 198, 196, 194, 197, 195, 159, 82, 198, 197, 83, 173, 199, 198, 82, 83, 197, 201, 202, 196, 198, 197, 194, 200, 202, 85, 196, 90, 312, 203, 167, 205, 204, 207, 205, 158, 156, 204, 206, 209, 207, 157, 154, 206, 208, 211, 209, 155, 152, 208, 210, 210, 211, 153, 214, 210, 212, 211, 210, 214, 206, 216, 212, 213, 215, 211, 204, 218, 216, 215, 217, 209, 205, 219, 218, 217, 219, 207, 218, 219, 212, 214, 219, 217, 144, 264, 220, 223, 221, 150, 151, 220, 222, 225, 223, 224, 244, 123, 222, 224, 126, 226, 264, 144, 227, 147, 146, 221, 140, 259, 227, 143, 147, 228, 259, 140, 230, 139, 143, 229, 230, 137, 232, 234, 139, 231, 232, 135, 235, 136, 234, 233, 131, 238, 235, 236, 237, 136, 129, 250, 238, 237, 239, 134, 250, 129, 240, 239, 241, 132, 240, 127, 242, 125, 128, 241, 123, 244, 242, 243, 226, 125, 248, 242, 245, 226, 243, 247, 251, 240, 248, 243, 241, 249, 253, 250, 251, 241, 239, 252, 505, 238, 253, 239, 237, 254, 238, 505, 255, 256, 254, 236, 506, 232, 255, 236, 233, 257, 232, 506, 258, 261, 257, 231, 230, 258, 260, 231, 229, 262, 259, 260, 263, 265, 262, 228, 271, 264, 263, 228, 221, 266, 245, 244, 267, 225, 226, 246, 267, 222, 269, 223, 225, 268, 269, 220, 271, 221, 223, 270, 117, 274, 272, 272, 273, 121, 113, 366, 274, 273, 275, 120, 366, 113, 276, 112, 116, 275, 105, 279, 276, 277, 278, 112, 101, 342, 279, 278, 280, 108, 342, 101, 281, 100, 104, 280, 94, 326, 281, 282, 283, 100, 326, 94, 284, 93, 97, 283, 284, 91, 286, 89, 93, 285, 289, 306, 290, 294, 291, 288, 288, 290, 293, 297, 294, 292, 292, 293, 296, 298, 297, 295, 296, 64, 295, 66, 69, 298, 300, 70, 296, 69, 73, 299, 302, 74, 300, 73, 80, 301, 305, 77, 302, 80, 84, 303, 305, 302, 290, 297, 301, 303, 293, 302, 296, 299, 301, 297, 305, 290, 306, 291, 294, 307, 304, 81, 305, 84, 201, 307, 308, 376, 202, 203, 309, 200, 304, 308, 199, 200, 310, 201, 202, 376, 311, 313, 309, 312, 311, 286, 86, 89, 287, 312, 315, 319, 316, 316, 317, 314, 319, 322, 320, 320, 321, 316, 325, 320, 323, 321, 320, 325, 289, 325, 306, 324, 325, 289, 306, 323, 308, 310, 324, 307, 367, 326, 327, 285, 283, 329, 331, 315, 314, 314, 318, 330, 334, 338, 335, 335, 336, 333, 341, 335, 339, 336, 335, 341, 330, 341, 331, 340, 341, 330, 346, 342, 343, 282, 280, 345, 343, 349, 347, 362, 348, 345, 353, 347, 350, 348, 362, 352, 361, 353, 354, 351, 352, 356, 358, 361, 354, 355, 356, 360, 358, 331, 361, 340, 332, 359, 361, 339, 353, 336, 340, 356, 353, 338, 347, 337, 336, 352, 347, 334, 346, 364, 337, 362, 342, 346, 363, 364, 345, 278, 363, 334, 333, 333, 337, 365, 279, 274, 276, 275, 273, 278, 365, 274, 363, 278, 273, 365, 326, 367, 343, 344, 329, 282, 343, 367, 349, 369, 329, 344, 349, 368, 350, 371, 369, 348, 354, 350, 370, 371, 351, 360, 322, 380, 372, 375, 373, 324, 372, 380, 374, 381, 373, 328, 327, 284, 372, 287, 285, 328, 372, 286, 308, 309, 287, 375, 377, 382, 358, 359, 378, 360, 358, 382, 315, 318, 378, 332, 380, 382, 377, 379, 378, 381, 319, 382, 380, 373, 378, 321, 384, 419, 385, 391, 386, 388, 393, 383, 389, 391, 388, 392, 389, 396, 394, 399, 395, 392, 396, 400, 397, 403, 398, 399, 400, 404, 401, 492, 402, 403, 424, 401, 405, 402, 492, 407, 408, 428, 405, 406, 409, 402, 411, 408, 404, 402, 410, 398, 400, 396, 411, 414, 395, 398, 396, 389, 413, 416, 390, 395, 417, 415, 389, 390, 416, 391, 417, 385, 420, 386, 391, 418, 374, 443, 422, 425, 423, 328, 443, 374, 405, 407, 381, 423, 368, 367, 422, 328, 329, 369, 384, 370, 419, 387, 386, 371, 443, 405, 429, 409, 406, 423, 432, 443, 429, 430, 423, 434, 451, 435, 431, 433, 450, 436, 438, 432, 435, 450, 433, 440, 438, 437, 441, 442, 440, 427, 426, 441, 420, 421, 442, 386, 438, 426, 370, 371, 427, 369, 422, 432, 438, 439, 433, 369, 459, 420, 444, 442, 421, 446, 437, 484, 444, 445, 447, 442, 484, 437, 448, 450, 440, 447, 451, 453, 448, 449, 452, 450, 431, 468, 453, 452, 454, 436, 468, 431, 455, 430, 434, 454, 455, 429, 457, 456, 458, 430, 461, 417, 459, 421, 418, 460, 487, 415, 461, 418, 416, 462, 415, 487, 463, 464, 462, 414, 466, 411, 463, 414, 412, 465, 485, 408, 466, 412, 410, 467, 408, 485, 457, 410, 409, 458, 468, 471, 469, 474, 470, 452, 471, 475, 472, 483, 473, 474, 479, 472, 476, 473, 483, 478, 476, 486, 480, 482, 481, 478, 480, 461, 479, 446, 460, 482, 472, 479, 459, 446, 478, 445, 484, 469, 472, 483, 474, 445, 448, 453, 484, 474, 452, 449, 457, 471, 468, 454, 470, 456, 475, 471, 457, 458, 470, 467, 476, 475, 485, 467, 473, 465, 486, 476, 466, 465, 477, 464, 463, 487, 486, 482, 462, 464, 491, 401, 488, 407, 492, 490, 501, 397, 491, 492, 403, 493, 397, 501, 494, 496, 493, 399, 394, 494, 495, 497, 496, 392, 499, 383, 495, 392, 388, 498, 502, 384, 499, 388, 387, 500, 502, 499, 488, 490, 498, 500, 495, 501, 491, 490, 493, 498, 502, 357, 384, 371, 360, 500, 502, 488, 377, 379, 489, 360, 424, 374, 488, 407, 489, 381 ], 49 | "subMeshes": [ 50 | { 51 | "materialIndex": 0, 52 | "verticesStart": 0, 53 | "verticesCount": 507, 54 | "indexStart": 0, 55 | "indexCount": 2904 56 | } 57 | ] 58 | } 59 | ], 60 | "multiMaterials": [ ] 61 | } --------------------------------------------------------------------------------