Dans mon application GLES20 simple j'essaye d'ajouter quelques objets dans l'exécution pour dessiner. Dans ma classe Renderer J'ai ArrayList des carrés:Comment ajouter des objets à dessiner à l'exécution en utilisant GLES20?
private ArrayList<Square> mSquares = new ArrayList<Square>();
Voici ma classe Square.
Square
dessine bien si crée dans onSurfaceCreated
.
Mais ce que je veux réellement faire. J'ai besoin d'ajouter de nouveaux Square
en mSquares
en cours d'exécution en cliquant sur le bouton et dessiner des carrés dans .
Dans ma classe Renderer j'ai créé AddFigure()
méthode:
public void AddFigure(float x, float y, float z)
{ // color coords angle
mSquares.add(new Square("Red square", new float[] {1, 0, 0, 1}, new float[] {x, y, z}, 100f));
}
J'invoque cette méthode en cliquant sur le bouton dans mon activité:
fab.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mGLRenderer.AddFigure(1f, 1f, 1f);
}
});
Mais jeter toujours cette exception:
E/AndroidRuntime: FATAL EXCEPTION: GLThread 220
java.util.ConcurrentModificationException
et
E/libEGL: call to OpenGL ES API with no current context (logged once per thread)
E/emuglGLESv2_enc: device/generic/goldfish-opengl/system/GLESv2_enc/GL2Encoder.cpp:s_glEnableVertexAttribArray:741 GL error 0x501
Info: Invalid vertex attribute index. Wanted index: 4294967295. Max index: 16
Je suis essayé en quelque sorte de le résoudre en utilisant glBufferData
et glBufferSubData
, mais n'ont pas de succès. Peut-être qu'il y a un exemple ou wiki comment le faire correctement?
'ArrayList' n'est pas un thread-safe de sorte que vous devriez faire synchronisé essayer Collections.synchronizedList() – Mohamed