blob: a168246e4d4db4e8b65695992c698da233717325 [file] [log] [blame]
/*
* Copyright (C) 2013 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
* in compliance with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software distributed under the License
* is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
* or implied. See the License for the specific language governing permissions and limitations under
* the License.
*/
#include "ReferenceRenderer.h"
#include "scene/flocking/FlockingScene.h"
#include <graphics/GLUtils.h>
#include <graphics/ProgramNode.h>
#include <Trace.h>
ReferenceRenderer::ReferenceRenderer(ANativeWindow* window) :
Renderer(window, false, 0) {
}
bool ReferenceRenderer::setUp() {
SCOPED_TRACE();
// Reset the times.
for (int i = 0; i < NUM_SETUP_TIMES; i++) {
mSetUpTimes[i] = 0;
}
// Set up OpenGLES.
double start = GLUtils::currentTimeMillis();
if (!Renderer::setUp()) {
return false;
}
mSetUpTimes[0] = GLUtils::currentTimeMillis() - start;
// Create the scenes.
mScenes[0] = new FlockingScene(mWidth, mHeight);
// TODO add more scenes to do a comprehensive test.
// Set up the scenes.
double times[NUM_SETUP_TIMES];
for (int i = 0; i < NUM_SCENES; i++) {
times[0] = GLUtils::currentTimeMillis();
mScenes[i]->setUpContext();
times[1] = GLUtils::currentTimeMillis();
mScenes[i]->setUpTextures();
times[2] = GLUtils::currentTimeMillis();
mScenes[i]->setUpMeshes();
times[3] = GLUtils::currentTimeMillis();
for (int i = 1; i < NUM_SETUP_TIMES; i++) {
// Add on the set up times.
mSetUpTimes[i] += times[i] - times[i - 1];
}
}
return true;
}
bool ReferenceRenderer::tearDown() {
SCOPED_TRACE();
for (int i = 0; i < NUM_SCENES; i++) {
mScenes[i]->tearDown();
delete mScenes[i];
}
mCurrentScene = NULL;
if (!Renderer::tearDown()) {
return false;
}
return true;
}
bool ReferenceRenderer::update(int frame) {
SCOPED_TRACE();
int sceneId = frame / ReferenceRenderer::FRAMES_PER_SCENE;
int localFrame = frame % ReferenceRenderer::FRAMES_PER_SCENE;
mCurrentScene = mScenes[sceneId];
mCurrentScene->update(localFrame);
return true;
}
bool ReferenceRenderer::draw() {
SCOPED_TRACE();
if (mOffscreen) {
glBindFramebuffer(GL_FRAMEBUFFER, mFboId);
}
// Set the background clear color to black.
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// Use culling to remove back faces.
glEnable(GL_CULL_FACE);
// Use depth testing.
glEnable(GL_DEPTH_TEST);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
mCurrentScene->draw();
return Renderer::draw();
}