函数介绍:
AMotionEvent_getX():以屏幕左上角为原点,是绝对坐标
AMotionEvent_getY():以屏幕左上角为原点,是绝对坐标
AMotionEvent_getPointerCount();多点触摸函数,返回触摸的点数量,跟硬件有关系
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LOGI(...) ((void)__android_log_print(ANDROID_LOG_ERROR, "native-activity", __VA_ARGS__))
#define LOGW(...) ((void)__android_log_print(ANDROID_LOG_WARN, "native-activity", __VA_ARGS__))
/**
?* Our saved state data.
?*/
struct saved_state {
? ? float angle;
? ? int32_t x;
? ? int32_t y;
};
/**
?* Shared state for our app.
?*/
struct engine {
? ? struct android_app* app;
? ? ASensorManager* sensorManager;
? ? const ASensor* accelerometerSensor;
? ? ASensorEventQueue* sensorEventQueue;
? ? int? ? ? ? animating;
? ? EGLDisplay? ? display;
? ? EGLSurface? ? surface;
? ? EGLContext? ? context;
? ? int32_t? ? width;
? ? int32_t? ? height;
? ? struct saved_state state;
};
class float3
{
public:
? ? float x,y,z;
};
std::vector g_arVertex;
/**
?* Initialize an EGL context for the current display.
?*/
static int engine_init_display(struct engine* engine) {
? ? // initialize OpenGL ES and EGL
? ? /*
? ? * Here specify the attributes of the desired configuration.
? ? * Below, we select an EGLConfig with at least 8 bits per color
? ? * component compatible with on-screen windows
? ? */
? ? const EGLint attribs[] =
? ? {
? ? ? ? ? ? EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
? ? ? ? ? ? EGL_BLUE_SIZE, 8,
? ? ? ? ? ? EGL_GREEN_SIZE, 8,
? ? ? ? ? ? EGL_RED_SIZE, 8,
? ? ? ? ? ? EGL_NONE
? ? };
? ? EGLint w, h, dummy, format;
? ? EGLint? ? ? ? numConfigs;
? ? EGLConfig? ? config;
? ? EGLSurface? ? surface;
? ? EGLContext? ? context;
? ? EGLDisplay? ? display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
? ? eglInitialize(display, 0, 0);
? ? /* Here, the application chooses the configuration it desires. In this
? ? * sample, we have a very simplified selection process, where we pick
? ? * the first EGLConfig that matches our criteria */
? ? eglChooseConfig(display, attribs, &config, 1, &numConfigs);
? ? /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
? ? * guaranteed to be accepted by ANativeWindow_setBuffersGeometry().
? ? * As soon as we picked a EGLConfig, we can safely reconfigure the
? ? * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
? ? eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
? ? ANativeWindow_setBuffersGeometry(engine->app->window, 0, 0, format);
? ? surface = eglCreateWindowSurface(display, config, engine->app->window, NULL);
? ? context = eglCreateContext(display, config, NULL, NULL);
? ? if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
? ? ? ? LOGW("Unable to eglMakeCurrent");
? ? ? ? return -1;
? ? }
? ? eglQuerySurface(display, surface, EGL_WIDTH, &w);
? ? eglQuerySurface(display, surface, EGL_HEIGHT, &h);
? ? engine->display? ? = display;
? ? engine->context? ? = context;
? ? engine->surface? ? = surface;
? ? engine->width? ? ? ? = w;
? ? engine->height? ? ? ? = h;
? ? engine->state.angle = 0;
? ? // Initialize GL state.
? ? glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
? ? glEnable(GL_CULL_FACE);
? ? glShadeModel(GL_SMOOTH);
? ? glDisable(GL_DEPTH_TEST);
? ? glViewport(0,0,w,h);
? ? glOrthof(0,w,h,0,-100,100);
? ? return 0;
}
/**
?* Just the current frame in the display.
?*/
static void engine_draw_frame(struct engine* engine) {
? ? if (engine->display == NULL) {
? ? ? ? // No display.
? ? ? ? return;
? ? }
? ? // Just fill the screen with a color.
? ? glClearColor(((float)engine->state