Skip to content

Commit

Permalink
handle POST on /three/geometry both for single geometry and for array
Browse files Browse the repository at this point in the history
  • Loading branch information
nmalex committed Feb 20, 2019
1 parent 036471b commit c81a5b0
Show file tree
Hide file tree
Showing 3 changed files with 130 additions and 52 deletions.
54 changes: 46 additions & 8 deletions src/endpoints/three/three.geometry.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,18 @@ import { injectable, inject } from "inversify";
import * as express from "express";
import { IEndpoint, IDatabase, ISettings, IFactory, IMaxscriptClient } from "../../interfaces";
import { TYPES } from "../../types";
import { isArray } from "util";

const LZString = require("lz-string");

@injectable()
class ThreeGeometryEndpoint implements IEndpoint {
private _settings: ISettings;
private _database: IDatabase;
private _maxscriptClientFactory: IFactory<IMaxscriptClient>;

private _geometriesJson: { [sessionGuid: string] : any; } = {};
// private _geometriesJson: { [sessionGuid: string] : any; } = {};
private _geometryCache: any = {};

constructor(@inject(TYPES.ISettings) settings: ISettings,
@inject(TYPES.IDatabase) database: IDatabase,
Expand All @@ -28,19 +32,53 @@ class ThreeGeometryEndpoint implements IEndpoint {
let uuid = req.params.uuid;
console.log(`todo: // retrieve geometry ${uuid}`);

let geometryJson = this._geometryCache[uuid];
if (!geometryJson) {
res.status(404);
res.end(JSON.stringify({ ok: false, message: "geometry not found", error: null }, null, 2));
return;
}

res.status(200);
res.end(JSON.stringify({}));
res.end(JSON.stringify(geometryJson));
}.bind(this));

express.post(`/v${this._settings.majorVersion}/three/geometry`, async function (this: ThreeGeometryEndpoint, req, res) {
let sessionGuid = req.body.session;
let sessionGuid = req.body.session_guid;
console.log(`POST on ${req.path} with session: ${sessionGuid}`);

let uuid = req.params.uuid;
console.log(`todo: // accept posted geometry ${uuid}`);

res.status(201);
res.end(JSON.stringify({}));
let compressedJson = req.body.compressed_json;
if (!compressedJson) {
res.status(400);
res.end(JSON.stringify({ ok: false, message: "missing compressed_json", error: null }, null, 2));
return;
}

let geometryJsonText = LZString.decompressFromBase64(compressedJson);
let geometryJson: any = JSON.parse(geometryJsonText);

let makeDownloadUrl = function(this: ThreeGeometryEndpoint, geometryJson: any) {
return `https://${this._settings.current.host}:${this._settings.current.port}/v${this._settings.majorVersion}/three/geometry/${geometryJson.uuid}`;
}.bind(this);

if (isArray(geometryJson)) {
let data = [];
for (let i in geometryJson) {
console.log("i: ", i);
this._geometryCache[geometryJson[i].uuid] = geometryJson[i];
let downloadUrl = makeDownloadUrl(geometryJson[i]);
data.push(downloadUrl);
}

res.status(201);
res.end(JSON.stringify({ ok: true, type: "url", data: data }));
} else {
this._geometryCache[geometryJson.uuid] = geometryJson;
let downloadUrl = makeDownloadUrl(geometryJson);

res.status(201);
res.end(JSON.stringify({ ok: true, type: "url", data: [ downloadUrl ] }));
}
}.bind(this));

express.put(`/v${this._settings.majorVersion}/three/geometry/:uuid`, async function (this: ThreeGeometryEndpoint, req, res) {
Expand Down
93 changes: 71 additions & 22 deletions test_client/js/demo.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ function initScene() {
{ // init camera
camera = new THREE.PerspectiveCamera(54, 640 / 480, 0.1, 1000);

camera.position.x = -3.54;
camera.position.y = 4.594;
camera.position.z = 1.671;
camera.position.x = -3.54*3;
camera.position.y = 4.594*3;
camera.position.z = 1.671*3;
camera.lookAt(0, 0.5, 0);
camera.updateProjectionMatrix();
scene.add(camera);
Expand All @@ -36,20 +36,20 @@ function initScene() {
window.demo.controls = controls;
}

var spotLight = new THREE.SpotLight( 0xffa0c0 );
var spotLight = new THREE.SpotLight( 0xffffff );
spotLight.name = "SpotLight1";
spotLight.position.set( 10, 40, 10 );
spotLight.target.position.set( 0, 0, 0 );
spotLight.angle = Math.PI / 30;
spotLight.angle = Math.PI / 25;

spotLight.castShadow = true;
spotLight.shadow.bias = 1e-6;
spotLight.shadow.mapSize.width = 512;
spotLight.shadow.mapSize.height = 512;

spotLight.shadow.camera.near = 15;
spotLight.shadow.camera.far = 43;
spotLight.shadow.camera.fov = Math.PI / 30;
spotLight.shadow.camera.far = 45;
spotLight.shadow.camera.fov = Math.PI / 25;
spotLight.shadow.camera.updateProjectionMatrix();

scene.add(spotLight);
Expand All @@ -63,35 +63,67 @@ function initScene() {
var geometry = new THREE.BoxGeometry(1, 1, 1);
geometry = new THREE.BufferGeometry().fromGeometry(geometry);

var material = new THREE.MeshPhongMaterial({
color: 0x40e040,
var materialWhite = new THREE.MeshPhongMaterial({
color: 0xffffff,
transparent: false,
opacity: 0.95
});

var materialRed = new THREE.MeshPhongMaterial({
color: 0xff0000,
transparent: false,
opacity: 0.95
});

var materialGreen = new THREE.MeshPhongMaterial({
color: 0x00ff00,
transparent: false,
opacity: 0.95
});

var cube = new THREE.Mesh(geometry, material);
cube.name = "Box01";
cube.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0.5, 0))
var materialBlue = new THREE.MeshPhongMaterial({
color: 0x0000ff,
transparent: false,
opacity: 0.95
});

var cube = new THREE.Mesh(geometry, materialWhite);
cube.name = "Box0";
cube.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0.5, 0));
cube.castShadow = true;
cube.receiveShadow = false;
scene.add(cube);

var cube2 = new THREE.Mesh(geometry, material);
cube2.name = "Box02";
cube2.applyMatrix(new THREE.Matrix4().makeTranslation(2, 0.5, 1))
cube2.castShadow = true;
cube2.receiveShadow = false;
scene.add(cube2);
var cubex = new THREE.Mesh(geometry, materialRed);
cubex.name = "BoxX";
cubex.applyMatrix(new THREE.Matrix4().makeTranslation(3, 0.5, 0));
cubex.castShadow = true;
cubex.receiveShadow = false;
scene.add(cubex);

var cubey = new THREE.Mesh(geometry, materialGreen);
cubey.name = "BoxY";
cubey.applyMatrix(new THREE.Matrix4().makeTranslation(0, 3.5, 0));
cubey.castShadow = true;
cubey.receiveShadow = false;
scene.add(cubey);

var cubez = new THREE.Mesh(geometry, materialBlue);
cubez.name = "BoxZ";
cubez.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0.5, 3));
cubez.castShadow = true;
cubez.receiveShadow = false;
scene.add(cubez);
// =============

var planeGeometry = new THREE.PlaneGeometry( 5, 5, 1 );
var planeGeometry = new THREE.PlaneGeometry( 7.5, 7.5, 1 );
planeGeometry = new THREE.BufferGeometry().fromGeometry(planeGeometry);
var material = new THREE.MeshPhongMaterial( {
var material = new THREE.MeshPhongMaterial({
color: 0xf0ffff,
transparent: true,
opacity: 0.5,
side: THREE.DoubleSide
} );
});

var plane = new THREE.Mesh( planeGeometry, material );
plane.applyMatrix(new THREE.Matrix4().makeRotationX(-Math.PI/2));
Expand Down Expand Up @@ -119,8 +151,25 @@ function renderScene(scene, camera) {
rfarm.createSession(function(newSession) {
console.log("newSession: ", newSession);

var sceneJson = scene.toJSON();
var geometriesJson = sceneJson.geometries;
var materialsJson = sceneJson.materials;

if (sceneJson.materials) {
delete sceneJson.materials;
}
if (sceneJson.geometries) {
delete sceneJson.geometries;
}

// rfarm.postGeometry(scene.)
console.log(geometriesJson);
rfarm.postGeometry(newSession.guid, geometriesJson, function(result) {
console.log(result);
});

console.log("Uploading scene...");
rfarm.postScene(newSession.guid, scene, function(result) {
rfarm.postScene(newSession.guid, sceneJson, function(result) {
console.log(result);

/* return;
Expand Down
35 changes: 13 additions & 22 deletions test_client/js/rfarm_client.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ function pad(num, size) {
var rfarm = {
apiKey: "75f5-4d53-b0f4",
workspace: "55a0bd33-9f15-4bc0-a482-17899eb67af3",
baseUrl: "https://acc.renderfarmjs.com",
// baseUrl: "https://acc.renderfarmjs.com",
baseUrl: "https://localhost:8000",

geometries: {}, // here we map scene geometry uuid <==> backend geometry resource
materials: {}, // here we map scene material uuid <==> backend material resource
Expand Down Expand Up @@ -323,16 +324,7 @@ rfarm.cancelRender = function(jobGuid, onCanceled) {
});
}.bind(rfarm);

rfarm.postScene = function(sessionGuid, scene, onComplete) {
var sceneJson = scene.toJSON();

if (sceneJson.materials) {
delete sceneJson.materials;
}
if (sceneJson.geometries) {
delete sceneJson.geometries;
}

rfarm.postScene = function(sessionGuid, sceneJson, onComplete) {
var sceneText = JSON.stringify(sceneJson);
var compressedSceneData = LZString.compressToBase64(sceneText);

Expand All @@ -353,27 +345,26 @@ rfarm.postScene = function(sessionGuid, scene, onComplete) {

}.bind(rfarm);

//=== private =
rfarm._postGeometry = function(geometry, onComplete) {
console.log("Importing geometry...");
rfarm.postGeometry = function(sessionGuid, geometryJson, onComplete) {
console.log("Posting geometry: " + geometryJson.uuid);

var geometryText = JSON.stringify(geometry.toJSON());
var compressedGeometryData = LZString144.compressToBase64(geometryText);
var geometryText = JSON.stringify(geometryJson);
var compressedGeometryData = LZString.compressToBase64(geometryText);

$.ajax({
url: this.baseUrl + "/scene/0/geometry",
url: this.baseUrl + "/v1/three/geometry",
data: {
session: this.sessionId,
geometry: compressedGeometryData
session_guid: sessionGuid,
compressed_json: compressedGeometryData
},
type: 'POST',
success: function(result) {
console.log(result);

let editableMeshNodeName = result.id;
this.geometries[ geometry.uuid ] = new rfarm._rfarmNode(geometry, editableMeshNodeName);
// let editableMeshNodeName = result.id;
// this.geometries[ geometry.uuid ] = new rfarm._rfarmNode(geometry, editableMeshNodeName);

if (onComplete) onComplete(result.id);
if (onComplete) onComplete();
}.bind(this),
error: function(err) {
console.error(err);
Expand Down

0 comments on commit c81a5b0

Please sign in to comment.