text: /*
   * This program is free software; you can redistribute it and/or
   * modify it under the terms of the GNU General Public License
   * as published by the Free Software Foundation; either version 2
   * of the License, or (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful,
   * but WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   * GNU General Public License for more details.
   *
   * You should have received a copy of the GNU General Public License
   * along with this program; if not, write to the Free Software Foundation,
   * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
   *
   * The Original Code is Copyright (C) 2016 Blender Foundation.
   * All rights reserved.
   */
  
  /** \file
   * \ingroup gpu
   *
   * GPU immediate mode work-alike
   */
  
  #ifndef __GPU_IMMEDIATE_H__
  #define __GPU_IMMEDIATE_H__
  
  #include "GPU_batch.h"
  #include "GPU_immediate_util.h"
  #include "GPU_primitive.h"
  #include "GPU_shader.h"
  #include "GPU_shader_interface.h"
  #include "GPU_vertex_format.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  /** Returns a cleared vertex format, ready for #add_attr. */
  GPUVertFormat *immVertexFormat(void);
  
  /** Every immBegin must have a program bound first. */
  void immBindProgram(uint32_t program, const GPUShaderInterface *);
  /** Call after your last immEnd, or before binding another program. */
  void immUnbindProgram(void);
  
  /** Must supply exactly vertex_len vertices. */
  void immBegin(GPUPrimType, uint vertex_len);
  /** Can supply fewer vertices. */
  void immBeginAtMost(GPUPrimType, uint max_vertex_len);
  void immEnd(void); /* finishes and draws. */
  
  /* immBegin a batch, then use standard immFunctions as usual. */
  /* immEnd will finalize the batch instead of drawing. */
  /* Then you can draw it as many times as you like!
   * Partially replaces the need for display lists. */
  GPUBatch *immBeginBatch(GPUPrimType, uint vertex_len);
  GPUBatch *immBeginBatchAtMost(GPUPrimType, uint vertex_len);
  
  /* Provide attribute values that can change per vertex. */
  /* First vertex after immBegin must have all its attributes specified. */
  /* Skipped attributes will continue using the previous value for that attr_id. */
  void immAttr1f(uint attr_id, float x);
  void immAttr2f(uint attr_id, float x, float y);
  void immAttr3f(uint attr_id, float x, float y, float z);
  void immAttr4f(uint attr_id, float x, float y, float z, float w);
  
  void immAttr2i(uint attr_id, int x, int y);
  
  void immAttr1u(uint attr_id, uint x);
  
  void immAttr2s(uint attr_id, short x, short y);
  
  void immAttr2fv(uint attr_id, const float data[2]);
  void immAttr3fv(uint attr_id, const float data[3]);
  void immAttr4fv(uint attr_id, const float data[4]);
  
  void immAttr3ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b);
  void immAttr4ub(uint attr_id, unsigned char r, unsigned char g, unsigned char b, unsigned char a);
  
  void immAttr3ubv(uint attr_id, const unsigned char data[3]);
  void immAttr4ubv(uint attr_id, const unsigned char data[4]);
  
  /* Explicitly skip an attribute. */
  /* This advanced option kills automatic value copying for this attr_id. */
  void immAttrSkip(uint attr_id);
  
  /* Provide one last attribute value & end the current vertex. */
  /* This is most often used for 2D or 3D position (similar to glVertex). */
  void immVertex2f(uint attr_id, float x, float y);
  void immVertex3f(uint attr_id, float x, float y, float z);
  void immVertex4f(uint attr_id, float x, float y, float z, float w);
  
  void immVertex2i(uint attr_id, int x, int y);
  
  void immVertex2s(uint attr_id, short x, short y);
  
  void immVertex2fv(uint attr_id, const float data[2]);
  void immVertex3fv(uint attr_id, const float data[3]);
  
  void immVertex2iv(uint attr_id, const int data[2]);
  
  /* Provide uniform values that don't change for the entire draw call. */
  void immUniform1i(const char *name, int x);
  void immUniform4iv(const char *name, const int data[4]);
  void immUniform1f(const char *name, float x);
  void immUniform2f(const char *name, float x, float y);
  void immUniform2fv(const char *name, const float data[2]);
  void immUniform3f(const char *name, float x, float y, float z);
  void immUniform3fv(const char *name, const float data[3]);
  void immUniformArray3fv(const char *name, const float *data, int count);
  void immUniform4f(const char *name, float x, float y, float z, float w);
  void immUniform4fv(const char *name, const float data[4]);
  void immUniformArray4fv(const char *bare_name, const float *data, int count);
  void immUniformMatrix4fv(const char *name, const float data[4][4]);
  
  /* Convenience functions for setting "uniform vec4 color". */
  /* The rgb functions have implicit alpha = 1.0. */
  void immUniformColor4f(float r, float g, float b, float a);
  void immUniformColor4fv(const float rgba[4]);
  void immUniformColor3f(float r, float g, float b);
  void immUniformColor3fv(const float rgb[3]);
  void immUniformColor3fvAlpha(const float rgb[3], float a);
  
  void immUniformColor3ub(unsigned char r, unsigned char g, unsigned char b);
  void immUniformColor4ub(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
  void immUniformColor3ubv(const unsigned char rgb[3]);
  void immUniformColor3ubvAlpha(const unsigned char rgb[3], unsigned char a);
  void immUniformColor4ubv(const unsigned char rgba[4]);
  
  /**
   * Extend #immBindProgram to use Blender’s library of built-in shader programs.
   * Use #immUnbindProgram() when done.
   */
  void immBindBuiltinProgram(eGPUBuiltinShader shader_id);
  
  /* Extend immUniformColor to take Blender's themes */
  void immUniformThemeColor(int color_id);
  void immUniformThemeColor3(int color_id);
  void immUniformThemeColorShade(int color_id, int offset);
  void immUniformThemeColorShadeAlpha(int color_id, int color_offset, int alpha_offset);
  void immUniformThemeColorBlendShade(int color_id1, int color_id2, float fac, int offset);
  void immUniformThemeColorBlend(int color_id1, int color_id2, float fac);
  void immThemeColorShadeAlpha(int colorid, int coloffset, int alphaoffset);
  
  /* These are called by the system -- not part of drawing API. */
  void immInit(void);
  void immActivate(void);
  void immDeactivate(void);
  void immDestroy(void);
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* __GPU_IMMEDIATE_H__ */
  