• R/O
  • HTTP
  • SSH
  • HTTPS

android: Commit

FermiSurfer for android


Commit MetaInfo

Revision40e45cbb9368bac0d87f3cc14f44e3f168393e30 (tree)
Zeit2019-08-30 10:15:55
Autormitsuaki1987 <kawamitsuaki@gmai...>
Commitermitsuaki1987

Log Message

Backup

Ändern Zusammenfassung

Diff

--- a/Android1.NativeActivity/main.cpp
+++ b/Android1.NativeActivity/main.cpp
@@ -17,7 +17,6 @@
1717 #include <EGL/egl.h>
1818 #include <GLES/gl.h>
1919
20-#include <android/sensor.h>
2120 #include <android/log.h>
2221 #include "android_native_app_glue.h"
2322
@@ -31,7 +30,6 @@
3130 * 保存状態のデータです。
3231 */
3332 struct saved_state {
34- float angle;
3533 int32_t x;
3634 int32_t y;
3735 };
@@ -41,16 +39,11 @@ struct saved_state {
4139 struct engine {
4240 struct android_app* app;
4341
44- ASensorManager* sensorManager;
45- const ASensor* accelerometerSensor;
46- ASensorEventQueue* sensorEventQueue;
47-
48- int animating;
4942 EGLDisplay display;
5043 EGLSurface surface;
5144 EGLContext context;
52- int32_t width;
53- int32_t height;
45+ EGLint width;
46+ EGLint height;
5447 struct saved_state state;
5548 };
5649 /**
@@ -69,70 +62,109 @@ static int engine_init_display(struct engine* engine) {
6962 EGL_BLUE_SIZE, 8,
7063 EGL_GREEN_SIZE, 8,
7164 EGL_RED_SIZE, 8,
65+ EGL_RENDERABLE_TYPE, EGL_OPENGL_ES_BIT,
7266 EGL_NONE
7367 };
74- EGLint w, h, format;
68+ EGLint format;
7569 EGLint numConfigs;
7670 EGLConfig config;
77- EGLSurface surface;
78- EGLContext context;
7971
80- EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
72+ engine->display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
8173
82- eglInitialize(display, 0, 0);
74+ eglInitialize(engine->display, 0, 0);
8375
8476 /* ここで、アプリケーションは目的の構成を選択します。このサンプルでは、
8577 * 抽出条件と一致する最初の EGLConfig を
8678 * 選択する単純な選択プロセスがあります */
87- eglChooseConfig(display, attribs, &config, 1, &numConfigs);
79+ eglChooseConfig(engine->display, attribs, &config, 1, &numConfigs);
8880
8981 /* EGL_NATIVE_VISUAL_ID は、ANativeWindow_setBuffersGeometry() に
9082 * よって受け取られることが保証されている EGLConfig の属性です。
9183 * EGLConfig を選択したらすぐに、ANativeWindow バッファーを一致させるために
9284 * EGL_NATIVE_VISUAL_ID を使用して安全に再構成できます。*/
93- eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
85+ eglGetConfigAttrib(engine->display, config, EGL_NATIVE_VISUAL_ID, &format);
9486
9587 ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
9688
97- surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
98- context = eglCreateContext(display, config, NULL, NULL);
89+ engine->surface = eglCreateWindowSurface(engine->display, config, engine->app->window, NULL);
90+ engine->context = eglCreateContext(engine->display, config, NULL, NULL);
9991
100- if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
92+ if (eglMakeCurrent(engine->display, engine->surface, engine->surface, engine->context) == EGL_FALSE) {
10193 LOGW("Unable to eglMakeCurrent");
10294 return -1;
10395 }
10496
105- eglQuerySurface(display, surface, EGL_WIDTH, &w);
106- eglQuerySurface(display, surface, EGL_HEIGHT, &h);
97+ eglQuerySurface(engine->display, engine->surface, EGL_WIDTH, &engine->width);
98+ eglQuerySurface(engine->display, engine->surface, EGL_HEIGHT, &engine->height);
10799
108- engine->display = display;
109- engine->context = context;
110- engine->surface = surface;
111- engine->width = w;
112- engine->height = h;
113- engine->state.angle = 0;
100+ FILE* fp = fopen("/sdcard/Download/test.txt", "w");
101+ fprintf(fp, "test %d %d\n", engine->width, engine->height);
102+ fclose(fp);
114103
115104 // GL の状態を初期化します。
116105 glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
117106 glEnable(GL_CULL_FACE);
118107 glShadeModel(GL_SMOOTH);
119- glDisable(GL_DEPTH_TEST);
120108
109+ glClearColor(0.0, 0.0, 0.0, 0.0);
110+ glEnable(GL_DEPTH_TEST);
111+ //glDisable(GL_DEPTH_TEST);
112+ glEnable(GL_LIGHTING);
113+ glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
114+ glEnable(GL_LIGHT0);
115+ glEnable(GL_LIGHT1);
116+ glEnable(GL_NORMALIZE);
117+ glEnableClientState(GL_VERTEX_ARRAY);
118+ glEnable(GL_COLOR_MATERIAL);
119+ glViewport(0, 0, engine->width, engine->height);
120+ glMatrixMode(GL_PROJECTION);
121+ glLoadIdentity();
122+ glMatrixMode(GL_MODELVIEW);
121123 return 0;
122124 }
123125 /**
124126 * ディスプレイ内の現在のフレームのみ。
125127 */
126128 static void engine_draw_frame(struct engine* engine) {
129+ int ntri = 1;
130+ GLfloat clr[] = { 1.0, 0.0, 0.0, 1.0,
131+ 0.0, 1.0, 0.0, 1.0,
132+ 0.0, 0.0, 1.0, 1.0};
133+ GLfloat kvp[] = {1.0, 0.0, 0.0,
134+ 0.0, 1.0, 0.0,
135+ 0.0, 0.0, 1.0 };
136+ GLfloat nmlp[] = {0.0, 0.0, 1.0,
137+ 0.0, 1.0, 1.0,
138+ 1.0, 0.0, 1.0};
139+ GLfloat pos[] = { 1.0f, 1.0f, 1.0f, 0.0f };
140+ GLfloat amb[] = { 0.2f, 0.2f, 0.2f, 0.0f };
141+
127142 if (engine->display == NULL) {
128143 // ディスプレイがありません。
129144 return;
130145 }
131146
147+ glLoadIdentity();
148+ glTranslatef(0.0, 0.0, -5.0);
149+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
150+ glLightfv(GL_LIGHT1, GL_AMBIENT, amb);
151+ //glScalef(1.0, 1.0, 1.0);
152+
132153 // 色で画面を塗りつぶします。
133- glClearColor(((float)engine->state.x) / engine->width, engine->state.angle,
134- ((float)engine->state.y) / engine->height, 1);
135- glClear(GL_COLOR_BUFFER_BIT);
154+ //glClearColor(((float)engine->state.x) / engine->width, 0.5, ((float)engine->state.y) / engine->height, 1);
155+ glClearColor(0.5, 0.5, 0.5, 1);
156+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
157+ //glEnableClientState(GL_NORMAL_ARRAY);
158+ //glEnableClientState(GL_COLOR_ARRAY);
159+ glColor4f(0.0, 0.0, 0.0, 1.0);
160+ glNormal3f(0.0f, 0.0f, 1.0f);
161+ glVertexPointer(3, GL_FLOAT, 0, kvp);
162+ //glNormalPointer(GL_FLOAT, 0, nmlp);
163+ //glColorPointer(4, GL_FLOAT, 0, clr);
164+ //glDrawArrays(GL_TRIANGLES, 0, ntri * 3);
165+ glDrawArrays(GL_LINES, 0, ntri * 2);
166+ //glDisableClientState(GL_NORMAL_ARRAY);
167+ //glDisableClientState(GL_COLOR_ARRAY);
136168
137169 eglSwapBuffers(engine->display, engine->surface);
138170 }
@@ -150,7 +182,6 @@ static void engine_term_display(struct engine* engine) {
150182 }
151183 eglTerminate(engine->display);
152184 }
153- engine->animating = 0;
154185 engine->display = EGL_NO_DISPLAY;
155186 engine->context = EGL_NO_CONTEXT;
156187 engine->surface = EGL_NO_SURFACE;
@@ -163,6 +194,7 @@ static int32_t engine_handle_input(struct android_app* app, AInputEvent* event)
163194 if (AInputEvent_getType(event) == AINPUT_EVENT_TYPE_MOTION) {
164195 engine->state.x = AMotionEvent_getX(event, 0);
165196 engine->state.y = AMotionEvent_getY(event, 0);
197+ engine_draw_frame(engine);
166198 return 1;
167199 }
168200 return 0;
@@ -191,24 +223,9 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
191223 engine_term_display(engine);
192224 break;
193225 case APP_CMD_GAINED_FOCUS:
194- // アプリがフォーカスを取得すると、加速度計の監視を開始します。
195- if (engine->accelerometerSensor != NULL) {
196- ASensorEventQueue_enableSensor(engine->sensorEventQueue,
197- engine->accelerometerSensor);
198- // 目標は 1 秒ごとに 60 のイベントを取得することです (米国)。
199- ASensorEventQueue_setEventRate(engine->sensorEventQueue,
200- engine->accelerometerSensor, (1000L / 60) * 1000);
201- }
202226 break;
203227 case APP_CMD_LOST_FOCUS:
204- // アプリがフォーカスを失うと、加速度計の監視を停止します。
205- // これにより、使用していないときのバッテリーを節約できます。
206- if (engine->accelerometerSensor != NULL) {
207- ASensorEventQueue_disableSensor(engine->sensorEventQueue,
208- engine->accelerometerSensor);
209- }
210228 // また、アニメーションを停止します。
211- engine->animating = 0;
212229 engine_draw_frame(engine);
213230 break;
214231 }
@@ -220,7 +237,6 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
220237 */
221238 void android_main(struct android_app* state) {
222239 struct engine engine;
223- FILE* fp;
224240
225241 memset(&engine, 0, sizeof(engine));
226242 state->userData = &engine;
@@ -228,73 +244,32 @@ void android_main(struct android_app* state) {
228244 state->onInputEvent = engine_handle_input;
229245 engine.app = state;
230246
231- // 加速度計の監視の準備
232- engine.sensorManager = ASensorManager_getInstance();
233- engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
234- ASENSOR_TYPE_ACCELEROMETER);
235- engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager,
236- state->looper, LOOPER_ID_USER, NULL, NULL);
237-
238247 if (state->savedState != NULL) {
239248 // 以前の保存状態で開始します。復元してください。
240249 engine.state = *(struct saved_state*)state->savedState;
241250 }
242251
243- engine.animating = 1;
244-
245252 // ループはスタッフによる開始を待っています。
246253
247- fp = fopen("/sdcard/Download/test.txt", "w");
248- fprintf(fp, "test\n");
249- fclose(fp);
250-
251254 while (1) {
252255 // 保留中のすべてのイベントを読み取ります。
253256 int ident;
254257 int events;
255258 struct android_poll_source* source;
256259
257- // アニメーションしない場合、無期限にブロックしてイベントが発生するのを待ちます。
258- // アニメーションする場合、すべてのイベントが読み取られるまでループしてから続行します
259- // アニメーションの次のフレームを描画します。
260- while ((ident = ALooper_pollAll(engine.animating ? 0 : -1, NULL, &events,
261- (void**)& source)) >= 0) {
260+ // 無期限にブロックしてイベントが発生するのを待ちます。
261+ while ((ident = ALooper_pollAll(-1, NULL, &events, (void**)& source)) >= 0) {
262262
263263 // このイベントを処理します。
264264 if (source != NULL) {
265265 source->process(state, source);
266266 }
267267
268- // センサーにデータがある場合、今すぐ処理します。
269- if (ident == LOOPER_ID_USER) {
270- if (engine.accelerometerSensor != NULL) {
271- ASensorEvent event;
272- while (ASensorEventQueue_getEvents(engine.sensorEventQueue,
273- &event, 1) > 0) {
274- LOGI("accelerometer: x=%f y=%f z=%f",
275- event.acceleration.x, event.acceleration.y,
276- event.acceleration.z);
277- }
278- }
279- }
280-
281268 // 終了するかどうか確認します。
282269 if (state->destroyRequested != 0) {
283270 engine_term_display(&engine);
284271 return;
285272 }
286273 }
287-
288- if (engine.animating) {
289- // イベントが完了したら次のアニメーション フレームを描画します。
290- engine.state.angle += .01f;
291- if (engine.state.angle > 1) {
292- engine.state.angle = 0;
293- }
294-
295- // 描画は画面の更新レートに合わせて調整されているため、
296- // ここで時間調整をする必要はありません。
297- engine_draw_frame(&engine);
298- }
299274 }
300275 }
Show on old repository browser