Autore Topic: Errore glDrawTexfOES c++ in NDK  (Letto 3375 volte)

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Errore glDrawTexfOES c++ in NDK
« il: 22 Luglio 2012, 11:20:31 CEST »
0
Salve ragazzi
stavo facendo un po' di prove perche' sto cercando di capire come funzionano alcune librerie in opengl es in ndk.
Per dirla tutta sto seguendo un libro come guida.
Ho caricato un esempio in eclipse , ma mi da un errore che non riesco a risolvere.
Il file che rivela l'errore è il seguente:

Codice: [Seleziona]
#include "GraphicsSprite.hpp"
#include "Log.hpp"

#include <GLES/gl.h>
#include <GLES/glext.h>

namespace packt {
    GraphicsSprite::GraphicsSprite(GraphicsTexture* pTexture,
        int32_t pHeight, int32_t pWidth, Location* pLocation) :
        mTexture(pTexture), mLocation(pLocation),
        mHeight(pHeight), mWidth(pWidth),
        mFrameCount(0), mFrameXCount(0), mFrameYCount(0),
        mAnimStartFrame(0), mAnimFrameCount(0),
        mAnimSpeed(0), mAnimFrame(0), mAnimLoop(false)
    {}

    void GraphicsSprite::load() {
        mFrameXCount = mTexture->getWidth() / mWidth;
        mFrameYCount = mTexture->getHeight() / mHeight;
        mFrameCount = (mTexture->getHeight() / mHeight)
                    * (mTexture->getWidth() / mWidth);
    }

    void GraphicsSprite::setAnimation(int32_t pStartFrame,
        int32_t pFrameCount, float pSpeed, bool pLoop) {
        mAnimStartFrame = pStartFrame;
        mAnimFrame = 0.0f, mAnimSpeed = pSpeed, mAnimLoop = pLoop;

        int32_t lMaxFrameCount = mFrameCount - pStartFrame;
        if ((pFrameCount > -1) && (pFrameCount <= lMaxFrameCount)) {
            mAnimFrameCount = pFrameCount;
        } else {
            mAnimFrameCount = lMaxFrameCount;
        }
    }

    bool GraphicsSprite::animationEnded() {
        return mAnimFrame > (mAnimFrameCount - 1);
    }

    void GraphicsSprite::draw(float pTimeStep) {
        int32_t lCurrentFrame, lCurrentFrameX, lCurrentFrameY;

        // Updates animation in loop mode.
        mAnimFrame += pTimeStep * mAnimSpeed;
        if (mAnimLoop) {
            lCurrentFrame = (mAnimStartFrame +
                             int32_t(mAnimFrame) % mAnimFrameCount);
        }
        // Updates animation in one-shot mode.
        else {
            // If animation ended.
            if (animationEnded()) {
                lCurrentFrame = mAnimStartFrame + (mAnimFrameCount-1);
            } else {
                lCurrentFrame = mAnimStartFrame + int32_t(mAnimFrame);
            }
        }
        // Computes frame X and Y indexes from its id.
        lCurrentFrameX = lCurrentFrame % mFrameXCount;
        // lCurrentFrameY is converted from OpenGL coordinates
        // to top-left coordinates.
        lCurrentFrameY = mFrameYCount - 1
                         - (lCurrentFrame / mFrameXCount);

        // Draws selected frame.
        mTexture->apply();
        int32_t lCrop[] = { lCurrentFrameX * mWidth,
                            lCurrentFrameY * mHeight,
                            mWidth, mHeight };
        glTexParameteriv(GL_TEXTURE_2D,
                         GL_TEXTURE_CROP_RECT_OES,
                         lCrop);
        glDrawTexfOES(mLocation->mPosX - (mWidth / 2), mLocation->mPosY - (mHeight / 2), 0.0f, mWidth, mHeight);
    }
}


La riga che mi da l'errore è la seguente:

Codice: [Seleziona]
glDrawTexfOES(mLocation->mPosX - (mWidth / 2), mLocation->mPosY - (mHeight / 2), 0.0f, mWidth, mHeight);


quando lo compilo con ndk-build
mi da il seguente errore
Codice: [Seleziona]
error: 'glDrawTexfOES' was not declared in this scope
sono andata in proprieta' del progetto in "Path e Symbols" e tra le tante path importate c'e'
${env_var:ANDROID_NDK}/platforms/android-9/arch-arm/usr/include
andando a vedere nel seguente percoso ho visto che la libreria <GLES/glext.h> contiene la funzione "glDrawTexfOES".
Come mai ndk nella compilazione mi da un errore come se la funzione non fosse presente ? pur avendo importato la libreria giusta?

Se vado su eclipse sopra all'errore mi viene detto "Function 'glDrawTexfOES' could not be resolved".
Cose' che sbaglio ?

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Errore glDrawTexfOES c++ in NDK
« Risposta #1 il: 22 Luglio 2012, 15:52:51 CEST »
+1
Prima di tutto non è propriamente l'errore di Eclipse, è l'errore del compilatore C++, Eclipse è un IDE e riporta l'errore del compilatore.

Stai usando le OpenGL-ES 1.1 con l'estensione "GL_OES_draw_texture":

http://www.khronos.org/registry/gles/extensions/OES/OES_draw_texture.txt

questa estensione potrebbe non essere disponibile nei terminali di fascia bassa.

Stai usando una estensione pubblica delle OpenGL, la stai richiamando come una funzione quindi devi per forza richiedere i prototipi delle funzioni. In altre parole devi definire "GL_GLEXT_PROTOTYPES" prima di includere "GLES/glext.h":

Codice: [Seleziona]
#define GL_GLEXT_PROTOTYPES
#include <GLES/glext.h>

ricordati di utilizzare anche la libreria "GLESv1_CM".


adb logcat | tee /tmp/logcat | grep TAG

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Re:Errore glDrawTexfOES c++ in NDK
« Risposta #2 il: 22 Luglio 2012, 17:07:07 CEST »
0
ok grazie mille


Stai usando una estensione pubblica delle OpenGL, la stai richiamando come una funzione quindi devi per forza richiedere i prototipi delle funzioni. In altre parole devi definire "GL_GLEXT_PROTOTYPES" prima di includere "GLES/glext.h":

Codice: [Seleziona]
#define GL_GLEXT_PROTOTYPES
#include <GLES/glext.h>


ho fatto come hai detto te  e funziona pero c'e' un altro problema ... quando ho fatto la modifica subito non è cambiato niente ...
ho dovuto fare il restart di eclipse .
Tu sai il motivo ?
Appena viene avviato eclipse viene fatta la compilazione con ndk-build in automattico ... e se lo eseguo l'applicazione funziona. E non mi da l'errore.
Ma se per esempio apro il file che mi hai detto di modificare mi ritorna l'errore. Sai il motivo ?
Come prima il tipo di errore "Function 'glDrawTexfOES' could not be resolved".

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Errore glDrawTexfOES c++ in NDK
« Risposta #3 il: 22 Luglio 2012, 19:16:50 CEST »
+1
ADT di Google solo dalla versione 20 ha un supporto parziale per NDK. Francamente non ho ancora letto cosa hanno implementato, con le vecchie versioni ADT ignorava totalmente i sorgenti C e C++, al massimo compilava la parte in Java e creava il pacchetto.

Io con NDK non uso Eclipse sono molto più veloce con altri software e con la linea di comando.
adb logcat | tee /tmp/logcat | grep TAG

Offline lz91

  • Nuovo arrivato
  • *
  • Post: 37
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S I-9000
  • Sistema operativo:
    Ubuntu, Windows 7
Re:Errore glDrawTexfOES c++ in NDK
« Risposta #4 il: 22 Luglio 2012, 21:13:25 CEST »
0
ok grazie .. :-)
per pura curiosità che software usi ? degli editor avanzati ?

Ma non c'e' un modo che compili io da riga di comanda e generi da eclipse il pacchetto apk.

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Errore glDrawTexfOES c++ in NDK
« Risposta #5 il: 23 Luglio 2012, 10:55:44 CEST »
0
Per scrivere un sorgente in C/C++ per me basta Vim con tante macro personalizzate. La gestione degli "include" in C/C++ è meno pesante degli "import" dettagliati in Java.

Per compilare la parte C/C++ c'è lo script "ndk-build" fornito dal NDK, basta eseguirlo nella directory del progetto. Per create il file .apk non serve per forza Eclipse, basta usare "ant" (è sopportato ufficialmente da Google insieme a Eclipse) e se serve installa anche il pacchetto.
adb logcat | tee /tmp/logcat | grep TAG