Skip to content

Commit

Permalink
fix: Support glTF-Embedded(beta)
Browse files Browse the repository at this point in the history
  • Loading branch information
kyasbal committed Nov 28, 2017
1 parent 50633d8 commit 34d62d3
Show file tree
Hide file tree
Showing 4 changed files with 177 additions and 10 deletions.
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
.LSOverride

# Icon must end with two \r
Icon
Icon


# Thumbnails
._*
Expand All @@ -24,6 +25,7 @@ Icon
Network Trash Folder
Temporary Items
.apdisk
.grimoire


### https://raw.github.com/github/gitignore/a392c48ccf4136ef75acb05b7ead4e9c75235c19/Node.gitignore
Expand Down
156 changes: 156 additions & 0 deletions debug.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
const fs = require("fs");
const http = require("http");
const URL = require("url");
const ep = "grimoire-e2e-worker.herokuapp.com";

function exists(path) {
return new Promise((resolve, reject) => {
fs.stat(path, (err, stat) => {
resolve(!err);
});
});
}

function read(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, "utf-8", (err, content) => {
if (err) {
reject(err);
} else {
resolve(content);
}
});
});
}

async function readJSON(path) {
return JSON.parse(await read(path));
}

function write(path, content) {
return new Promise((resolve, reject) => {
fs.writeFile(path, content, { encoding: "utf-8" }, (err) => {
if (err) {
reject(err);
} else {
resolve();
}
});
});
}

function writeJSON(path, content) {
return write(path, JSON.stringify(content, null, 2));
}

function toBase64(str) {
const b = new Buffer(str);
return b.toString('base64');
}

function request(method, host, path, data, contentType = "application/json") {
return new Promise((resolve, reject) => {
let result = "";
const req = http.request({
host: host,
path: path,
port: 80,
method: method,
headers: {
'Content-Type': contentType,
'Content-Length': Buffer.byteLength(data),
'Cache-Control': 'no-cache,no-store'
}
}, (res) => {
res.setEncoding("utf-8");
res.on("close", () => {
resolve();
});
res.on("error", (err) => {
reject(err);
});
res.on("data", (data) => {
result += data;
});
}).on("close", () => {
resolve(result);
});
req.write(data);
req.end();
});
}


function btoa(str) {
var buffer;
if (Buffer.isBuffer(str)) {
buffer = str;
}
else {
buffer = new Buffer(str.toString(), 'binary');
}

return buffer.toString('base64');
};

function deflate(val) {
val = encodeURIComponent(val); // UTF16 → UTF8
val = btoa(val); // base64エンコード
return val;
}


async function uploadAndGetShortName(id, expire, cachedSignedAddr) {
const pkgJson = await read("./package.json");
const pkgJsonObj = JSON.parse(pkgJson);
let name = pkgJsonObj.name;
let shortName;
if (name === "grimoirejs") {
name = "grimoire";
shortName = "grimoirejs";
} else {
const regexedName = /grimoirejs-(.+)/.exec(name);
name = "grimoire-" + regexedName[1];
shortName = regexedName[1];
}
const files = await Promise.all([read(`./register/${name}.js`), read(`./register/${name}.js.map`)]);
const ct = ["text/javascript", "text/plain"];
let addr;
if (expire <= Date.now()) {
addr = JSON.parse(await request("GET", ep, `/debugAddr/${id}/${name}`, ""));
const cfg = await readJSON(".grimoire");
cfg.cachedSignedAddr = addr;
cfg.expire = Date.now() + 1000 * 60 * 60 * 24 * 6;
await writeJSON(".grimoire", cfg);
console.log("SignedURL updated");
} else {
addr = cachedSignedAddr;
}
const uploads = [addr["js"], addr["map"]];
await Promise.all(uploads.map(u => URL.parse(u)).map((p, i) => request("PUT", p.host, p.path, files[i], ct[i])));
return shortName;
}

async function configure() {
if (!await exists(".grimoire")) {
const id = Math.random().toString(36).slice(-8)
await writeJSON(".grimoire", {
id,
arg: [],
expire: 0,
configAddr: {

}
});
}
return await readJSON(".grimoire");
}

async function main() {
const { id, arg, expire, cachedSignedAddr } = await configure();
const shortName = await uploadAndGetShortName(id, expire, cachedSignedAddr);
let param = `${shortName}=staging-${id}`;
console.log(`http://${ep}/?arg=${toBase64(param)}`);
}

main();
5 changes: 3 additions & 2 deletions src/Parser/DefaultParserModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ export default class DefaultParserModule extends ParserModule {
* @return {Promise<Texture2D>} [description]
*/
public fetchTextureResource(tf: GLTFImage): Promise<HTMLImageElement> {
return this.__fetchImage(this.baseDirectory + tf.uri);
return this.__fetchImage(this.__asAbsoluteURL(this.baseDirectory, tf.uri));
}

/**
Expand All @@ -85,7 +85,7 @@ export default class DefaultParserModule extends ParserModule {
* @return {Promise<ArrayBuffer>} [description]
*/
public loadBufferResource(tf: GLTFBuffer): Promise<ArrayBuffer> {
return this.__fetchBuffer(this.baseDirectory + tf.uri);
return this.__fetchBuffer(this.__asAbsoluteURL(this.baseDirectory, tf.uri));
}

public async loadBufferResources(tf: GLTF): Promise<{ [key: string]: ArrayBuffer }> {
Expand Down Expand Up @@ -275,6 +275,7 @@ export default class DefaultParserModule extends ParserModule {
};
}


private _pathNameToGrimoire(name: string): { component: string, attributeName: string } {
switch (name) {
case "translation":
Expand Down
22 changes: 15 additions & 7 deletions src/Parser/ParserModuleBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,19 @@ import ConstantConverter from "./ConstantConverter";
*/
export default class ParserModuleBase {

protected __convertBufferView<T extends ArrayBufferView>(ctor:new(buffer:ArrayBuffer,offset:number,count:number)=>T,bufferView:ArrayBufferView,bufferViewInfo:GLTFBufferView,accessor:GLTFAccessor){
protected __convertBufferView<T extends ArrayBufferView>(ctor: new (buffer: ArrayBuffer, offset: number, count: number) => T, bufferView: ArrayBufferView, bufferViewInfo: GLTFBufferView, accessor: GLTFAccessor) {
let offset = 0;
if(bufferView.byteOffset){
if (bufferView.byteOffset) {
offset += bufferView.byteOffset
}
if(accessor.byteOffset){
offset+= accessor.byteOffset;
if (accessor.byteOffset) {
offset += accessor.byteOffset;
}
let count = accessor.count * ConstantConverter.asVectorSize(accessor.type);
if(bufferViewInfo.byteStride){
if (bufferViewInfo.byteStride) {
count = bufferViewInfo.byteStride * accessor.count / ConstantConverter.asByteSize(accessor.componentType);
}
return new ctor(bufferView.buffer as ArrayBuffer,offset,count);
return new ctor(bufferView.buffer as ArrayBuffer, offset, count);
}

protected __fetchBuffer(url: string): Promise<ArrayBuffer> {
Expand All @@ -45,6 +45,14 @@ export default class ParserModuleBase {
return ImageResolver.resolve(url);
}

protected __asAbsoluteURL(baseDirURL: string, path: string): string {
if (this.__isDataUri(path)) {
return path;
} else {
return baseDirURL + path;
}
}

/**
* Check provided string being data uri or not.
* @param {string} target [description]
Expand Down Expand Up @@ -130,7 +138,7 @@ export default class ParserModuleBase {
default:
throw new Error("Unknown array buffer");
}
if(stride !== 0){
if (stride !== 0) {
throw new Error("Accessing a buffer with stride is not supported yet.");
}
return (i) => {
Expand Down

0 comments on commit 34d62d3

Please sign in to comment.