2012-04-17 20 views
-2

イメージを開いてOpenGLウィンドウを開くプログラムを作成し、アンドロイドデバイスに接続します。このアンドロイドデバイスでは、デバイスをパンやズームインやズームアウトのためのトラックパッドとして使用します。すべてが正常に動作していますが、プログラムはglutMainLoopで停止し、デバイスからのデータの受け入れを続行しません。どうやらglutIdleFuncは私の問題の解決策ですが、メモリエラーを起こすことなく自分のコードにこれを実装する方法を知ることはできません。誰かが私のコードに関数を入れる方法を教えてくれたので、OpenGLのものだけでなく接続コードも実行できますか?glutMainLoopから抜け出すためにglutIdleFuncを使用しますか?

#include <stdlib.h> 
#include <stdio.h> 
#include <signal.h> 
#include <string.h> 
#include <strings.h> 
#include <vrpn_Shared.h> 
#include <vrpn_Analog.h> 
#include <vector> 
#include <GL/freeglut.h> 
#include <imageviewer.h> 

using namespace std; 

int done = 0; 
int accepted = 0;   // Signals that the program should exit 
unsigned tracker_stride = 1; // Every nth report will be printed 


//------------------------------------- 
// This section contains the data structure that holds information on 
// the devices that are created. For each named device, a remote of each 
// type analog is created. 

class device_info { 
    public: 
    char   *name; 

    vrpn_Analog_Remote *ana; 

}; 
const unsigned MAX_DEVICES = 2; 


//------------------------------------- 
// This section contains the data structure that is used to determine how 
// often to print a report for each sensor of each tracker. Each element 
// contains a counter that is used by the callback routine to keep track 
// of how many it has skipped. There is an element for each possible sensor. 
// A new array of elements is created for each new tracker object, and a 
// pointer to it is passed as the userdata pointer to the callback handlers. 


class t_user_callback { 
    public: 
    char   t_name[vrpn_MAX_TEXT_LEN]; 
     vector<unsigned> t_counts ; 
}; 

//Callback handlers 

void VRPN_CALLBACK handle_analog (void *userdata, const vrpn_ANALOGCB a) 
{ 
    int i; 
    const char *name = (const char *)userdata; 

    printf("Input from %s:\n \n  %5.0f", name, a.channel[0]); 
    for (i = 1; i < a.num_channel; i++) { 
    printf(" %5.0f \n", a.channel[1]); 
    } 
    printf(" \n"); 
} 




int main (int argc, char * argv []) 
{ 

    int print_for_tracker = 1; // Print tracker reports? 
    int print_for_button = 1; // Print button reports? 
    int print_for_analog = 1; // Print analog reports? 
    int print_for_dial = 1; // Print dial reports? 
    int print_for_text = 1; // Print warning/error messages? 


    device_info device_list[MAX_DEVICES]; 
    unsigned num_devices = 0; 


    int i; 

    // Parse arguments, creating objects 

    for (i = 1; i < argc; i++) { 
    if (!strcmp(argv[i], "-notracker")) { 
     print_for_tracker = 0; 
    } else if (!strcmp(argv[i], "-nobutton")) { 
     print_for_button = 0; 
    } else if (!strcmp(argv[i], "-noanalog")) { 
     print_for_analog = 0; 
    } else if (!strcmp(argv[i], "-nodial")) { 
     print_for_dial = 0; 
    } else if (!strcmp(argv[i], "-notext")) { 
     print_for_text = 0; 

    } else if (!strcmp(argv[i], "-trackerstride")) { 
     if (tracker_stride <= 0) { 
     fprintf(stderr, "-trackerstride argument must be 1 or greater\n"); 
     return -1; 
     } 
    } else { // Create a device and connect to it. 
    device_info *dev; 



    // Name the device and open it as everything 
    dev = &device_list[num_devices]; 
    dev->name = argv[i]; 

    dev->ana = new vrpn_Analog_Remote(dev->name); 


    if (print_for_analog) { 
     printf(" Analog"); 
     dev->ana->register_change_handler(dev->name, handle_analog); 
    } 
    printf(".\n"); 
    num_devices++; 
    } 

    } 

// main interactive loop 

    printf("Press ^C to exit.\n"); 
    while (! done) { 
     unsigned i; 

     // Let all the devices do their things 
     for (i = 0; i < num_devices; i++) { 

     device_list[i].ana->mainloop(); 

     glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 
    glutInitWindowSize(400,300); 
    glutInitWindowPosition(200,100); 
    glutCreateWindow("ImageViewer"); 


    init(); 
    glutDisplayFunc(display); 
    glutMotionFunc(drag); 
    glutMouseFunc(mouse); 
// glutIdleFunc(IdleFunc); 
    glutMainLoop(); 

     } 
    } 
return 0; 
} 
+0

GLUTはAndroidとOpenGL ESで動作しますか? –

+0

イメージデータは、デバイス上にレンダリングされず、そのすべてがPC上にレンダリングされます。あなたのニコールさんが何を求めているのかわからないですか? –

+0

たぶん彼はアンドロイドについてのゲームを書いていて、それはタグを説明しているのでしょうか? –

答えて

1

すべての入力デバイスを管理でき、すべてが管理している入力からイベント駆動型である場合は問題ありません。管理されていない入力デバイスまたはイベントベースではない処理を取得したら、おそらくglut以外のものを使用することになります。あなたの別の方法は、別のプロセス(またはスレッド)で非同期のものをforkして実行することです。

関連する問題