/* San Angeles Observation OpenGL ES version example
* Copyright 2009 The Android Open Source Project
* All rights reserved.
*
* This source is free software; you can redistribute it and/or
* modify it under the terms of EITHER:
* (1) The GNU Lesser General Public License as published by the Free
* Software Foundation; either version 2.1 of the License, or (at
* your option) any later version. The text of the GNU Lesser
* General Public License is included with this source in the
* file LICENSE-LGPL.txt.
* (2) The BSD-style license that is included with this source in
* the file LICENSE-BSD.txt.
*
* This source is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
* LICENSE-LGPL.txt and LICENSE-BSD.txt for more details.
*/
#include <jni.h>
#include <sys/time.h>
#include <time.h>
#include <android/log.h>
#include <stdint.h>
#include "importgl.h"
#include "app.h"
int gAppAlive = 1;
static int sWindowWidth = 320;
static int sWindowHeight = 480;
static int sDemoStopped = 0;
static long sTimeOffset = 0;
static int sTimeOffsetInit = 0;
static long sTimeStopped = 0;
static long
_getTime(void)
{
struct timeval now;
gettimeofday(&now, NULL);
return (long)(now.tv_sec*1000 + now.tv_usec/1000);
}
/* Call to initialize the graphics state */
void
Java_com_example_SanAngeles_DemoRenderer_nativeInit( JNIEnv* env )
{
importGLInit();
appInit();
gAppAlive = 1;
}
void
Java_com_example_SanAngeles_DemoRenderer_nativeResize( JNIEnv* env, jobject thiz, jint w, jint h )
{
sWindowWidth = w;
sWindowHeight = h;
__android_log_print(ANDROID_LOG_INFO, "SanAngeles", "resize w=%d h=%d", w, h);
}
/* Call to finalize the graphics state */
void
Java_com_example_SanAngeles_DemoRenderer_nativeDone( JNIEnv* env )
{
appDeinit();
importGLDeinit();
}
/* This is called to indicate to the render loop that it should
* stop as soon as possible.
*/
void _pause()
{
/* we paused the animation, so store the current
* time in sTimeStopped for future nativeRender calls */
sDemoStopped = 1;
sTimeStopped = _getTime();
}
void _resume()
{
/* we resumed the animation, so adjust the time offset
* to take care of the pause interval. */
sDemoStopped = 0;
sTimeOffset -= _getTime() - sTimeStopped;
}
void
Java_com_example_SanAngeles_DemoGLSurfaceView_nativeTogglePauseResume( JNIEnv* env )
{
sDemoStopped = !sDemoStopped;
if (sDemoStopped)
_pause();
else
_resume();
}
void
Java_com_example_SanAngeles_DemoGLSurfaceView_nativePause( JNIEnv* env )
{
_pause();
}
void
Java_com_example_SanAngeles_DemoGLSurfaceView_nativeResume( JNIEnv* env )
{
_resume();
}
/* Call to render the next GL frame */
void
Java_com_example_SanAngeles_DemoRenderer_nativeRender( JNIEnv* env )
{
long curTime;
/* NOTE: if sDemoStopped is TRUE, then we re-render the same frame
* on each iteration.
*/
if (sDemoStopped) {
curTime = sTimeStopped + sTimeOffset;
} else {
curTime = _getTime() + sTimeOffset;
if (sTimeOffsetInit == 0) {
sTimeOffsetInit = 1;
sTimeOffset = -curTime;
curTime = 0;
}
}
//__android_log_print(ANDROID_LOG_INFO, "SanAngeles", "curTime=%ld", curTime);
appRender(curTime, sWindowWidth, sWindowHeight);
}