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. |