Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(487)

Unified Diff: samples/beachdemo/beachdemo.js

Issue 147258: Add a utility to adjust rendering quality based on rendering performance. (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/o3d/
Patch Set: Fixed the last few comments and added js_list.scons. Created 11 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « plugin/idl/pack.idl ('k') | samples/o3djs/js_list.scons » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: samples/beachdemo/beachdemo.js
===================================================================
--- samples/beachdemo/beachdemo.js (revision 19692)
+++ samples/beachdemo/beachdemo.js (working copy)
@@ -49,9 +49,8 @@
o3djs.require('o3djs.fps');
o3djs.require('o3djs.debug');
o3djs.require('o3djs.particles');
+o3djs.require('o3djs.performance');
-var RENDER_TARGET_WIDTH = 256;
-var RENDER_TARGET_HEIGHT = 256;
var PROXY_HEIGHT = 5150;
// client.root
@@ -128,6 +127,9 @@
var g_waterTransform;
var g_reflectionTexture;
var g_refractionTexture;
+var g_reflectionImage;
+var g_refrectionImage;
+var g_depthSurface;
var g_globalParams;
var g_globalClockParam;
var g_clipHeightParam;
@@ -180,6 +182,9 @@
var g_showError = false;
var g_sceneEffects = [];
var g_sceneTexturesByURI;
+var g_renderTargetWidth = 256;
+var g_renderTargetHeight = 256;
+var g_perfMon;
var g_camera = {
farPlane: 80000,
@@ -1541,6 +1546,8 @@
}
}
}
+ g_perfMon = o3djs.performance.createPerformanceMonitor(
+ 25, 35, increaseRenderTargetResolution, decreaseRenderTargetResolution);
}
try {
@@ -1815,6 +1822,10 @@
// Render the FPS display.
g_client.renderTree(g_fpsManager.viewInfo.root);
+
+ if (g_perfMon) {
+ g_perfMon.onRender(renderEvent.elapsedTime);
+ }
}
function onAllLoadingFinished() {
@@ -1843,6 +1854,82 @@
o3djs.util.makeClients(initStep2, 'LargeGeometry');
}
+function setupRenderTargets() {
+ var oldReflectionTexture;
+ var oldRefractionTexture;
+ var oldDepthSurface;
+
+ if (g_reflectionTexture) {
+ g_mainPack.removeObject(g_reflectionSurfaceSet.renderSurface);
+ g_mainPack.removeObject(g_refractionSurfaceSet.renderSurface);
+ g_mainPack.removeObject(g_reflectionTexture);
+ g_mainPack.removeObject(g_refractionTexture);
+ g_mainPack.removeObject(g_depthSurface);
+ } else {
+ // First time only.
+ g_reflectionSurfaceSet = g_mainPack.createObject('RenderSurfaceSet');
+ g_refractionSurfaceSet = g_mainPack.createObject('RenderSurfaceSet');
+ }
+
+ // Create Render Targets for the reflection and refraction.
+ g_reflectionTexture = g_mainPack.createTexture2D(g_renderTargetWidth,
+ g_renderTargetHeight,
+ g_o3d.Texture.ARGB8, 1,
+ true);
+ var reflectionSurface = g_reflectionTexture.getRenderSurface(0, g_mainPack);
+ g_refractionTexture = g_mainPack.createTexture2D(g_renderTargetWidth,
+ g_renderTargetHeight,
+ g_o3d.Texture.XRGB8, 1,
+ true);
+ var refractionSurface = g_refractionTexture.getRenderSurface(0, g_mainPack);
+ g_depthSurface = g_mainPack.createDepthStencilSurface(g_renderTargetWidth,
+ g_renderTargetHeight);
+
+ // Set up the render graph to generate them.
+ g_reflectionSurfaceSet.renderSurface = reflectionSurface;
+ g_reflectionSurfaceSet.renderDepthStencilSurface = g_depthSurface;
+
+ g_refractionSurfaceSet.renderSurface = refractionSurface;
+ g_refractionSurfaceSet.renderDepthStencilSurface = g_depthSurface;
+
+ g_updateRenderTargets = true;
+
+ if (g_waterMaterial) { // Every time after the first.
+ var sampler = g_waterMaterial.getParam('reflectionSampler').value;
+ sampler.texture = g_reflectionTexture;
+ sampler = g_waterMaterial.getParam('refractionSampler').value;
+ sampler.texture = g_refractionTexture;
+ g_reflectionImage.sampler.texture = g_reflectionTexture;
+ g_refractionImage.sampler.texture = g_refractionTexture;
+ }
+}
+
+function increaseRenderTargetResolution() {
+ var changed;
+ if (g_renderTargetWidth < 2048) {
+ g_renderTargetWidth <<= 1;
+ changed = true;
+ }
+ if (g_renderTargetHeight < 2048) {
+ g_renderTargetHeight <<= 1;
+ changed = true;
+ }
+ setupRenderTargets();
+}
+
+function decreaseRenderTargetResolution() {
+ var changed;
+ if (g_renderTargetWidth > 256) {
+ g_renderTargetWidth >>= 1;
+ changed = true;
+ }
+ if (g_renderTargetHeight > 256) {
+ g_renderTargetHeight >>= 1;
+ changed = true;
+ }
+ setupRenderTargets();
+}
+
/**
* Initializes O3D and loads the scene into the transform graph.
* @param {Array} clientElements Array of o3d object elements.
@@ -1865,20 +1952,6 @@
g_mainPack = g_client.createPack();
g_scenePack = g_client.createPack();
- // Create Render Targets for the reflection and refraction.
- g_reflectionTexture = g_mainPack.createTexture2D(RENDER_TARGET_WIDTH,
- RENDER_TARGET_HEIGHT,
- g_o3d.Texture.ARGB8, 1,
- true);
- var reflectionSurface = g_reflectionTexture.getRenderSurface(0, g_mainPack);
- g_refractionTexture = g_mainPack.createTexture2D(RENDER_TARGET_WIDTH,
- RENDER_TARGET_HEIGHT,
- g_o3d.Texture.XRGB8, 1,
- true);
- var refractionSurface = g_refractionTexture.getRenderSurface(0, g_mainPack);
- var depthSurface = g_mainPack.createDepthStencilSurface(RENDER_TARGET_WIDTH,
- RENDER_TARGET_HEIGHT);
-
g_mainRoot = g_mainPack.createObject('Transform');
g_baseRoot = g_scenePack.createObject('Transform');
g_baseRoot.parent = g_mainRoot;
@@ -1887,15 +1960,8 @@
g_mainRoot.parent = g_client.root;
g_sceneRoot.translate(0, 0, -g_waterLevel);
- // Setup the render graph to generate them.
- g_reflectionSurfaceSet = g_mainPack.createObject('RenderSurfaceSet');
- g_reflectionSurfaceSet.renderSurface = reflectionSurface;
- g_reflectionSurfaceSet.renderDepthStencilSurface = depthSurface;
+ setupRenderTargets();
- g_refractionSurfaceSet = g_mainPack.createObject('RenderSurfaceSet');
- g_refractionSurfaceSet.renderSurface = refractionSurface;
- g_refractionSurfaceSet.renderDepthStencilSurface = depthSurface;
-
// Create states to set clipping.
g_reflectionClipState = g_mainPack.createObject('State');
g_reflectionClipState.getStateParam('AlphaTestEnable').value = true;
@@ -2540,22 +2606,28 @@
// Make images to show the render targets.
for (var ii = 0; ii < 2; ++ii) {
+ var textureDisplaySquareSize = 256;
var renderTargetTexture = (ii == 0) ? g_reflectionTexture :
g_refractionTexture;
- var scale = 1;
var x = 10;
- var y = 10 + ii * (g_reflectionTexture.height * scale + 10);
+ var y = 10 + ii * (textureDisplaySquareSize + 10);
var borderSize = 2;
var image;
// make a back image to create a border around render target.
image = new Image(g_renderTargetDisplayRoot, backTexture, true);
image.transform.translate(x - borderSize, y - borderSize, -3);
- image.transform.scale(renderTargetTexture.width * scale + borderSize * 2,
- renderTargetTexture.height * scale + borderSize * 2,
+ image.transform.scale(textureDisplaySquareSize + borderSize * 2,
+ textureDisplaySquareSize + borderSize * 2,
1);
image = new Image(g_renderTargetDisplayRoot, renderTargetTexture, true);
image.transform.translate(x, y, -2);
- image.transform.scale(scale, scale, 1);
+ image.transform.scale(textureDisplaySquareSize / g_renderTargetWidth,
+ textureDisplaySquareSize / g_renderTargetHeight, 1);
+ if (ii == 0) {
+ g_reflectionImage = image;
+ } else {
+ g_refractionImage = image;
+ }
}
// Make a fader plane.
« no previous file with comments | « plugin/idl/pack.idl ('k') | samples/o3djs/js_list.scons » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698