Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WebXR Support #1834

Merged
merged 30 commits into from
Feb 8, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
d6abbea
origin/webxr
Maksims Jan 19, 2020
e14f9b9
lint fixes
Maksims Jan 19, 2020
5b8d0d9
respect parent transform, fix start/end session rendering
Maksims Jan 20, 2020
31054d6
resize graphics device to respect XR session framebuffer
Maksims Jan 25, 2020
5f8ff76
provide multiple XR session types; AR
Maksims Jan 25, 2020
f9d8568
better API, tidy up, lint clean
Maksims Jan 30, 2020
70d339a
merge
Maksims Jan 30, 2020
45903ba
jsdocs fixes
Maksims Jan 30, 2020
95c3fff
fix tests
Maksims Jan 30, 2020
d8b9599
add backwards compatibility warnings for VR
Maksims Jan 30, 2020
5d0c342
remove deprecated VR camera logic
Maksims Jan 30, 2020
77ba3ae
Merge branch 'master' into webxr
Maksims Jan 30, 2020
4f70715
Merge branch 'master' of github.com:playcanvas/engine into webxr
Maksims Jan 30, 2020
92fb7e6
remove VR examples and add XR examples
Maksims Jan 30, 2020
d21a68c
Merge branch 'webxr' of github.com:Maksims/engine-1 into webxr
Maksims Jan 30, 2020
2deb5f5
lint errors
Maksims Jan 30, 2020
1d001fb
Merge branch 'master' into webxr
willeastcott Jan 31, 2020
407c0e6
Merge branch 'master' of github.com:playcanvas/engine into webxr
Maksims Feb 4, 2020
52304f9
Merge branch 'webxr' of github.com:Maksims/engine-1 into webxr
Maksims Feb 4, 2020
1ebcd83
address PR comments
Maksims Feb 4, 2020
9aedc74
calculate camera XR frustum based on XR view
Maksims Feb 4, 2020
462d537
fix XR normals bug, and change position/rotation calculation
Maksims Feb 4, 2020
2616d31
API renaming/simplification
Maksims Feb 5, 2020
8b84b9d
undepricate WebVR
Maksims Feb 5, 2020
f500fb2
fixes
Maksims Feb 5, 2020
c6dd516
rename pc.XR_TYPE_* to simplified version
Maksims Feb 6, 2020
b0c78bf
remove CameraComponent.isXr property
Maksims Feb 6, 2020
be08fb2
Merge branch 'master' into webxr
Maksims Feb 8, 2020
2639133
Merge branch 'master' of github.com:playcanvas/engine into webxr
Maksims Feb 8, 2020
40272a7
Merge branch 'webxr' of github.com:Maksims/engine-1 into webxr
Maksims Feb 8, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions build/dependencies.txt
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@
../src/input/element-input.js
../src/vr/vr-manager.js
../src/vr/vr-display.js
../src/xr/xr-manager.js
../src/net/http.js
../src/script/script-registry.js
../src/script/script.js
Expand Down
8 changes: 7 additions & 1 deletion examples/examples.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,5 +71,11 @@ var categories = [
"text-wrap",
"various"
]
}, {
name: "xr",
examples: [
'augmented-reality-basic',
'virtual-reality-basic'
]
}
];
];
85 changes: 52 additions & 33 deletions examples/style.css

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 1 addition & 7 deletions examples/style.css.map

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 3 additions & 3 deletions examples/style.scss
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ body {
}
}
}

.sidenav-toggle {
position: absolute;
right: 12px;
Expand Down Expand Up @@ -108,8 +108,8 @@ iframe {
border: 0px;
left: 0;
right: 0;
padding-left: 160px;
width: calc(100% - 160px);
padding-left: 240px;
width: calc(100% - 240px);
height: 100%;
overflow: auto;
@media screen and (max-width: $break-medium) {
Expand Down
170 changes: 170 additions & 0 deletions examples/xr/augmented-reality-basic.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,170 @@
<!DOCTYPE html>
<html>
<head>
<title>PlayCanvas Virtual Reality</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0">
<link rel="icon" type="image/png" href="../playcanvas-favicon.png" />
<script src="../../build/output/playcanvas.js"></script>
<style>
body {
margin: 0;
padding: 0;
overflow: hidden;
}
canvas {
width:100%;
height:100%;

}
.message {
position: absolute;
padding: 8px 16px;
left: 20px;
bottom: 0px;
color: #ccc;
background-color: rgba(0, 0, 0, .5);
font-family: "Proxima Nova", Arial, sans-serif;
}
</style>
</head>

<body>
<canvas id="application-canvas"></canvas>
<div>
<p class="message"></p>
</div>
<script>
// draw some axes
var drawAxes = function (pos, scale) {
var color = new pc.Color(1,0,0);

var axis = new pc.Vec3();
var end = new pc.Vec3().copy(pos).add(axis.set(scale,0,0));

app.renderLine(pos, end, color);

color.set(0, 1, 0);
end.sub(axis.set(scale,0,0)).add(axis.set(0,scale,0));
app.renderLine(pos, end, color);

color.set(0, 0, 1);
end.sub(axis.set(0,scale,0)).add(axis.set(0,0,scale));
app.renderLine(pos, end, color);
}
</script>


<script>
var message = function (msg) {
var el = document.querySelector('.message');
el.textContent = msg;
}

var canvas = document.getElementById('application-canvas');
var app = new pc.Application(canvas, {
mouse: new pc.Mouse(canvas),
touch: new pc.TouchDevice(canvas),
keyboard: new pc.Keyboard(window)
});
app.setCanvasFillMode(pc.FILLMODE_FILL_WINDOW);
app.setCanvasResolution(pc.RESOLUTION_AUTO);

window.addEventListener("resize", function () {
app.resizeCanvas(canvas.width, canvas.height);
});

// use device pixel ratio
app.graphicsDevice.maxPixelRatio = window.devicePixelRatio;

app.start();

// create camera
var c = new pc.Entity();
c.addComponent('camera', {
clearColor: new pc.Color(0, 0, 0, 0),
farClip: 10000
});
app.root.addChild(c);

var l = new pc.Entity();
l.addComponent("light", {
type: "spot",
range: 30
});
l.translate(0,10,0);
app.root.addChild(l);


var createCube = function(x,y,z) {
var cube = new pc.Entity();
cube.addComponent("model", {
type: "box",
});
cube.setLocalScale(.5, .5, .5);
cube.translate(x * .5, y, z * .5);
app.root.addChild(cube);
};

// create a grid of cubes
var SIZE = 4;
for (var x = 0; x < SIZE; x++) {
for (var y = 0; y < SIZE; y++) {
createCube(2*x - SIZE, -1, 2*y - SIZE);
}
}

if (app.xr.supported) {
var activate = function () {
if (app.xr.isAvailable(pc.XR_TYPE_IMMERSIVE_AR)) {
c.camera.startXr(pc.XR_TYPE_IMMERSIVE_AR, function (err) {
if (err) message("WebXR Immersive AR failed to start: " + err.message);
});
} else {
message("WebXR Immersive AR is not available");
}
};

app.mouse.on("mousedown", function () {
if (! app.xr.active)
activate();
});

if (app.touch) {
app.touch.on("touchend", function () {
if (! app.xr.active) {
// if not in VR, activate
activate();
} else {
// otherwise reset camera
c.camera.endXr();
}
});
}

// end session by keyboard ESC
app.keyboard.on('keydown', function (evt) {
if (evt.key === pc.KEY_ESCAPE && app.xr.active) {
app.xr.end();
}
});

app.xr.on('start', function () {
message("WebXR Immersive AR session has started");
});
app.xr.on('end', function () {
message("WebXR Immersive AR session has ended");
});
app.xr.on('available:' + pc.XR_TYPE_IMMERSIVE_AR, function (available) {
message("WebXR Immersive AR is now " + (available ? 'available' : 'unavailable'));
});

if (! app.xr.isAvailable(pc.XR_TYPE_IMMERSIVE_AR)) {
message("WebXR Immersive AR is not available");
}
} else {
message("WebXR is not supported");
}
</script>
</body>
</html>
Loading