GIModel.SimpleModel

From SunFlurry wiki
Jump to: navigation, search
  GIModel.New (Общие функции моделей)
Объект:Атрибуты и функции моделей
Статус разработки: Реализована
Тип:Функция
Обращение к БД:Нет
Исключения:Неверные аргументы
Визуальность:Нет

Функция сопоставляет буфер с микрокодом с текущей моделью. Буфер может быть как сопоставлен с текущей моделью (любые изменения в нем приведут к изменениям в модели), так и скопирован в независимую область памяти при сопоставлении, что медленнее при создании, но, возможно более удобно, если модель не изменяется вообще. Выбор подхода остается на усмотрении разработчика, обычно удобнее сопоставлять буфер и этот способ работает по умолчанию. Буфер обычно удобно заполнять функцией AddValues, либо загружать заранее подготовленную модель из файла.

Микрокод зависит от текущей графической спецификации. Микрокод представляет собой последовательность двойных слов (32 бита, но могут быть и слова 64 бита) в буфере с номерами команд спецификации и их аргументами (чаще всего вещественные числа 32 бит или целые числа 32 бит) по данной ниже таблице. При прорисовке модели, система проходит по всем командам буфера до тех пор, пока она не встретит команду 0 или конец буфера. Данный способ прорисовки гораздо быстрее прямого вызова графических команд, так как он происходит на низком уровне. Ниже дана таблица микрокода для спецификации OpenGL:

Команда (32 бит) Аргументы Соответствующая команда OpenGL
0 Аргументов нет. Команда окончания рисования.
1 Один аргумент int32, параметр glBegin. Может быть GI.GL_POINTS, GI.GL_LINES, GI.GL_QUADS и т.д. glBegin
2 Аргументов нет. Окончание транзакции рисования glEnd. glEnd
3 Один аргумент int32, параметр glEnable. glEnable
4 Один аргумент int32, параметр glDisable. glDisable
5 Два аргумента int32, один single, параметры glTexEnv. glTexEnv
6 Два аргумента int32, параметр glBlendFunc. glBlendFunc
7 Четыре аргумента int32, параметры glBlendFuncSeparate. glBlendFuncSeparate
8 Один аргумент int32, параметр glBlendEquation. glBlendEquation
9 Два аргумента int32, параметры glBlendEquationSeparate. glBlendEquationSeparate
10 Четыре аргумент single, параметры glBlendColor. glBlendColor
11 Четыре аргумента int32, параметр glColorMask. glColorMask
12 Один аргумент int32, параметр glLogicOp. glLogicOp
13 Один аргумент int32, параметр glDrawBuffer. glDrawBuffer
14 Один аргумент int32 -- количество буферов (N), затем N-аргументов int32 перечисляющих эти буферы. glDrawBuffers
100 Три аргумента single, параметры glVertex. glVertex
101 Три аргумента single, параметры glColor. glColor
102 Шесть аргументов single, параметры glMaterial (см. glMaterialfv) glMaterial
103 Три аргумента single, параметры glTexCoord. glTexCoord
104 Три аргумента single, параметры glNormal. glNormal
105 Один аргумент int32, параметр glEdgeFlag. glEdgeFlag
106 Один аргумент single, параметры glFogCoord. glFogCoord
110 Три аргумента int32, параметры glDrawArrays. glDrawArrays
111 Три аргумента int32 (mode, count, type), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawElements
112 Пять аргументов int32 (mode, starts, end, count, type), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawRangeElements
113 Четыре аргумента int32, параметры glDrawArraysInstanced. glDrawArraysInstanced
114 Четыре аргумента int32 (mode, count, type, instancecount), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawElementsInstanced
115 Четыре аргумента int32 (mode, count, type, basevertex), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawElementsBaseVertex
116 Шесть аргументов int32 (mode, start, end, count, type, basevertex), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawRangeElementsBaseVertex
117 Пять аргументов int32 (mode, count, type, instancecount, basevertex), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawElementsInstancedBaseVertex
118 Один аргумент int32 (mode), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawArraysIndirect
119 Два аргумента int32 (mode, type), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawElementsIndirect
120 Два аргумента int32 (mode, id) glDrawTransformFeedback
121 Три аргумента int32 (mode, id, stream) glDrawTransformFeedbackStream
122 Пять аргументов int32, параметры glDrawArraysInstancedBaseInstance. glDrawArraysInstancedBaseInstance
123 Пять аргументов int32 (mode, count, type, instancecount, baseinstance), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawElementsInstancedBaseInstance
124 Шесть аргументов int32 (mode, count, type, instancecount, basevertex, baseinstance), один аргумент int32 (размер данных в байтах), далее N-байт данных. glDrawElementsInstancedBaseVertexBaseInstance
125 Три аргумента int32, параметры glDrawTransformFeedbackInstanced. glDrawTransformFeedbackInstanced
126 Четыре аргумента int32, параметры glDrawTransformFeedbackStreamInstanced. glDrawTransformFeedbackStreamInstanced
130 Два аргумента int32 (mode, drawcount), один аргумент int32 (размер массива начальных индексов "first" в байтах), один аргумент int32 (размер массива количеств индексов "count" в байтах), далее N-байт данных массив "first", далее N-байт массив "count". glMultiDrawArrays
131 Три аргумента int32 (mode, type, drawcount), один аргумент int32 (размер массива количеств "count" в байтах), один аргумент int32 (размер массива индексов "*indices" в байтах), далее N-байт данных массив "count", далее N-байт массив "*indices". Внимание: массив "*indices" должен содержать реальные адреса в памяти (см. Buffer.SystemAddress). glMultiDrawElements
132 Три аргумента int32 (mode, type, drawcount), один аргумент int32 (размер массива количеств "count" в байтах), один аргумент int32 (размер массива индексов "*indices" в байтах), один аргумент int32 (размер массива вертексов "basevertex" в байтах), далее N-байт данных массив "count", далее N-байт массив "*indices", далее N-байт данных массив "basevertex". Внимание: массив "*indices" должен содержать реальные адреса в памяти (см. Buffer.SystemAddress). glMultiDrawElementsBaseVertex
133 Три аргумента int32 (mode, drawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. glMultiDrawArraysIndirect
134 Четыре аргумента int32 (mode, type, drawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. glMultiDrawElementsIndirect
135 Четыре аргумента int32 (mode, drawcount, maxdrawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. glMultiDrawArraysIndirectCount
136 Пять аргументов int32 (mode, type, drawcount, maxdrawcount, stride), один аргумент int32 (размер массива записей "indirect" в байтах), далее N-байт данных массив "indirect" -- элементы этого массива содержат более одного значения, см. описание. glMultiDrawElementsIndirectCount
200 Одни аргумент int32, параметр glActiveTexture. glActiveTexture
201 Два аргумента int32, параметры glBindTexture. glBindTexture
202 Три аргумента int32 (size, type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". glVertexPointer
203 Два аргумента int32 (type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". glIndexPointer
204 Два аргумента int32 (type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". glNormalPointer
205 Три аргумента int32 (size, type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". glTexCoordPointer
206 Три аргумента int32 (size, type, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". glColorPointer
207 Один аргумент int32 (stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". glEdgeFlagPointer
208 Пять аргументов int32 (index, size, type, normalized, stride), один аргумент int32 (размер массива "pointer" в байтах), далее N-байт данных массив "pointer". glVertexAttribPointer
210 Один аргумент int32, параметр glEnableVertexAttribArray. glEnableVertexAttribArray
211 Один аргумент int32, параметр glDisableVertexAttribArray. glDisableVertexAttribArray
220 Один аргумент int32, параметр glBindVertexArray. glBindVertexArray
221 Два аргумента int32, параметры glBindBuffer. glBindBuffer
222 Четыре аргумента int32, параметры glBindVertexBuffer. glBindVertexBuffer
300 Один аргумента int32, параметр glUseProgram. glUseProgram
301 Три аргумента int32 (уникальный номер переменной программы шейдеров, количество значений для переменных-массивов (к примеру, см. glUniform2fv, для обычных переменных этот аргумент обычно равен 1), тип значений). Далее, в зависимости от типа значений, следуют значения или их системный адрес. Тип значений представлят собой битовую маску со следующими битами (ATttttSSSSssss):
  • биты 0..3 (ssss): количество чисел в значении (к примеру, для glUniform2f, два числа).
  • биты 4..7 (SSSS): только для переменных-матриц, количество чисел в матрице по вертикали (к примеру, для glUniformMatrix2f равно 1, для glUniformMatrix4x3f равно 4).
  • биты 8..11 (tttt): числовой тип значений. 0 -- single float, 1 -- int32, 2 -- uint32 (без знака), 3 -- double float (если поддерживается драйвером)
  • бит 12 (T): только для переменных-матриц, 1, если матрица транспонирована (другой порядок значений).
  • бит 13 (A): вместо самих значений последующий аргумент -- 64-битный системный адрес массива значений. И для x86 и для x64 аргумент занимает 8 байт, для x86 последние 4 байта игнорируются.

Примеры: glUniformMatrix2f: $012, glUniformMatrix4x3f: $043, glUniform3f: $003 и т.п.

glUniform???
302 Один аргумента int32 -- уникальный номер переменной программы шейдеров. Эта команда транслируется как glUniform1f(<номер переменной>,<значение GI.WorldTime>). Заполнение GI.WorldTime (u_time)
303 Один аргумента int32 -- уникальный номер переменной программы шейдеров. Эта команда транслируется как glUniform2f(<номер переменной>,<значение GI.Width>,<значение GI.Height>). Заполнение Width/Height (u_resolution)
304 Один аргумента int32 -- уникальный номер переменной программы шейдеров. Эта команда транслируется как glUniform2f(<номер переменной>,<позиция мыши по X>,<позиция мыши по Y>). Заполнение mouse.x/mouse.y (u_mouse)
400 Аргументов нет. Выполнение glPushMatrix. glPushMatrix
401 Три аргумента single, движение текущей матрицы по x, y и z. glTranslatef
402 Три аргумента single, поворот текущей матрицы вокрут осей x, y и z. glRotatef
403 Три аргумента single, масштабирование текущей матрицы по осям x, y и z. glScalef
404 Аргументов нет. Выполнение glPopMatrix. glPopMatrix
405 Один аргумент int32, параметр glMatrixMode. glMatrixMode


Синтаксис

GIModel.SimpleModel(<Источник микрокода (BUFFER)>,<Режим модели (INT)>=0)

Аргументы

  • <Источник микрокода (BUFFER)> - Аргумент задает буфер, в котором задан или будет задан микрокод для прорисовки модели.
  • <Режим модели (INT)> - (необязательный аргумент) Аргумент режим модели и буфера и является битовой маской со следующими битами:
    • бит 0: 0 -- использовать функции спецификации с числами single (по умолчанию), иначе использовать функции с числами double, где это возможно. Не все драйверы могут поддерживать числа double.
    • бит 1: 0 -- указанный буфер будет ассоциирован с моделью, все изменения в буфере будут сказываться на модели (по умолчанию), иначе содержимое буфера будет скопировано в особую область памяти и модель будет рисоваться по этим данным.

Примеры

//Используется фрагмент из обработки tetris.sfo

//Создадим новую простую модель с пустым буфером
аБуфер:=Buffer.Create();
аМодель:=GIModel.New();
аМодель.SimpleModel(аБуфер);

//Заполним буфер микрокодом
аСмещ:=0;
аБуфер.AddValues(аСмещ,4,201,aGI.GL_TEXTURE_2D,0);//glBindTexture
аБуфер.AddValues(аСмещ,4,300,лкПрограммы[3]);//ShaderProgramUse
аБуфер.AddValues(аСмещ,4,301,aGI.ShaderProgramGetVariableID(лкПрограммы[3],"u_scrpos"),4,$004);
аБуфер.AddValues(аСмещ,104,x,aGI.Height-y,2*dx,2*dx);//u_scrpos
аБуфер.AddValues(аСмещ,4,302,aGI.ShaderProgramGetVariableID(лкПрограммы[3],"u_time"));//u_time
аБуфер.AddValues(аСмещ,4,301,aGI.ShaderProgramGetVariableID(лкПрограммы[3],"u_starttime"),1,$001);
аБуфер.AddValues(аСмещ,104,aGI.WorldTime);//u_starttime
    
аБуфер.AddValues(аСмещ,4,1,aGI.GL_QUADS);//glBegin
аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x,y,-0.3);//glVertex
аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x,y+2*dx,-0.3);//glVertex
аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x+2*dx,y+2*dx,-0.3);//glVertex
аБуфер.AddValues(аСмещ,4,100);аБуфер.AddValues(аСмещ,104,x+2*dx,y,-0.3);//glVertex
аБуфер.AddValues(аСмещ,4,2);//glEnd
аБуфер.AddValues(аСмещ,4,0);//EOF

//Создадим новый объект и добавим к нему эту модель
аОбъект:=aGI.AddObject("EXP");
аОбъект.Model(аМодель);