Как добавить объекты для рисования во время выполнения с помощью GLES20?

В моем простом приложении GLES20 я пытаюсь добавить некоторые объекты во время выполнения для рисования. В моем классе Renderer у меня есть ArrayList of Squares:

private ArrayList<Square> mSquares = new ArrayList<Square>();

Вот мой квадратный класс.

Square хорошо рисует, если создать его в onSurfaceCreated,

Но то, что я на самом деле хочу сделать. Мне нужно добавить новый Square в mSquares во время выполнения по нажатию кнопки и рисовать квадраты в onDrawFrame,

В моем классе Renderer я создал AddFigure() метод:

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));
}

Я вызываю этот метод, нажав на кнопку в моей активности:

fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
                mGLRenderer.AddFigure(1f, 1f, 1f);
        }
    });

Но это всегда выкидывает такие исключения:

E/AndroidRuntime: FATAL EXCEPTION: GLThread 220
    java.util.ConcurrentModificationException

а также

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

Я пытался как-то исправить это с помощью glBufferData а также glBufferSubData, но не имеют успеха. Может быть есть пример или вики как это правильно сделать?

1 ответ

Решение

Это ошибка ConcurrentModification, которая означает, что вы пытаетесь получить доступ к конвейеру рендеринга из потока, отличного от рендеринга OpenGL.

Это должен быть способ сделать это:

glSurfaceView.queueEvent(new Runnable() {
                    @Override
                    public void run() {
                        mGLRenderer.AddFigure(1f, 1f, 1f);
                    }
                });
Другие вопросы по тегам