1/* San Angeles Observation OpenGL ES version example
2 * Copyright 2009 The Android Open Source Project
3 * All rights reserved.
4 *
5 * This source is free software; you can redistribute it and/or
6 * modify it under the terms of EITHER:
7 *   (1) The GNU Lesser General Public License as published by the Free
8 *       Software Foundation; either version 2.1 of the License, or (at
9 *       your option) any later version. The text of the GNU Lesser
10 *       General Public License is included with this source in the
11 *       file LICENSE-LGPL.txt.
12 *   (2) The BSD-style license that is included with this source in
13 *       the file LICENSE-BSD.txt.
14 *
15 * This source is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the files
18 * LICENSE-LGPL.txt and LICENSE-BSD.txt for more details.
19 */
20#include <jni.h>
21#include <sys/time.h>
22#include <time.h>
23#include <android/log.h>
24#include <stdint.h>
25
26int   gAppAlive   = 1;
27
28static int  sWindowWidth  = 320;
29static int  sWindowHeight = 480;
30static int  sDemoStopped  = 0;
31static long sTimeOffset   = 0;
32static int  sTimeOffsetInit = 0;
33static long sTimeStopped  = 0;
34
35static long
36_getTime(void)
37{
38    struct timeval  now;
39
40    gettimeofday(&now, NULL);
41    return (long)(now.tv_sec*1000 + now.tv_usec/1000);
42}
43
44/* Call to initialize the graphics state */
45void
46Java_com_example_SanAngeles_DemoRenderer_nativeInit( JNIEnv*  env )
47{
48    importGLInit();
49    appInit();
50    gAppAlive    = 1;
51    sDemoStopped = 0;
52    sTimeOffsetInit = 0;
53}
54
55void
56Java_com_example_SanAngeles_DemoRenderer_nativeResize( JNIEnv*  env, jobject  thiz, jint w, jint h )
57{
58    sWindowWidth  = w;
59    sWindowHeight = h;
60    __android_log_print(ANDROID_LOG_INFO, "SanAngeles", "resize w=%d h=%d", w, h);
61}
62
63/* Call to finalize the graphics state */
64void
65Java_com_example_SanAngeles_DemoRenderer_nativeDone( JNIEnv*  env )
66{
67    appDeinit();
68    importGLDeinit();
69}
70
71/* This is called to indicate to the render loop that it should
72 * stop as soon as possible.
73 */
74void
75Java_com_example_SanAngeles_DemoGLSurfaceView_nativePause( JNIEnv*  env )
76{
77    sDemoStopped = !sDemoStopped;
78    if (sDemoStopped) {
79        /* we paused the animation, so store the current
80         * time in sTimeStopped for future nativeRender calls */
81        sTimeStopped = _getTime();
82    } else {
83        /* we resumed the animation, so adjust the time offset
84         * to take care of the pause interval. */
85        sTimeOffset -= _getTime() - sTimeStopped;
86    }
87}
88
89/* Call to render the next GL frame */
90void
91Java_com_example_SanAngeles_DemoRenderer_nativeRender( JNIEnv*  env )
92{
93    long   curTime;
94
95    /* NOTE: if sDemoStopped is TRUE, then we re-render the same frame
96     *       on each iteration.
97     */
98    if (sDemoStopped) {
99        curTime = sTimeStopped + sTimeOffset;
100    } else {
101        curTime = _getTime() + sTimeOffset;
102        if (sTimeOffsetInit == 0) {
103            sTimeOffsetInit = 1;
104            sTimeOffset     = -curTime;
105            curTime         = 0;
106        }
107    }
108
109    //__android_log_print(ANDROID_LOG_INFO, "SanAngeles", "curTime=%ld", curTime);
110
111    appRender(curTime, sWindowWidth, sWindowHeight);
112}
113