text: /*
  ===========================================================================
  Copyright (C) 1999-2005 Id Software, Inc.
  
  This file is part of Quake III Arena source code.
  
  Quake III Arena source code 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.
  
  Quake III Arena source code 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 Quake III Arena source code; if not, write to the Free Software
  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  ===========================================================================
  */
  #ifndef TR_COMMON_H
  #define TR_COMMON_H
  
  #define USE_VULKAN
  
  #include "../qcommon/q_shared.h"
  #include "../renderercommon/tr_public.h"
  
  #define MAX_TEXTURE_UNITS 8
  
  typedef enum
  {
  	IMGFLAG_NONE           = 0x0000,
  	IMGFLAG_MIPMAP         = 0x0001,
  	IMGFLAG_PICMIP         = 0x0002,
  	IMGFLAG_CLAMPTOEDGE    = 0x0004,
  	IMGFLAG_CLAMPTOBORDER  = 0x0008,
  	IMGFLAG_NO_COMPRESSION = 0x0010,
  	IMGFLAG_NOLIGHTSCALE   = 0x0020,
  	IMGFLAG_LIGHTMAP       = 0x0040,
  	IMGFLAG_NOSCALE        = 0x0080,
  	IMGFLAG_RGB            = 0x0100,
  } imgFlags_t;
  
  typedef enum {
  	CT_FRONT_SIDED,
  	CT_BACK_SIDED,
  	CT_TWO_SIDED
  } cullType_t;
  
  typedef struct image_s {
  	char		*imgName;			// image path, including extension
  	struct image_s *next;			// for hash search
  	int			width, height;		// source image
  	int			uploadWidth;		// after power of two and picmip but not including clamp to MAX_TEXTURE_SIZE
  	int			uploadHeight;
  	imgFlags_t	flags;
  	int			frameUsed;			// for texture usage in frame statistics
  
  #ifdef USE_VULKAN
  	int			internalFormat;
  
  	int			wrapClampMode;
  	VkImage		handle;
  	VkImageView	view;
  	// Descriptor set that contains single descriptor used to access the given image.
  	// It is updated only once during image initialization.
  	VkDescriptorSet descriptor;
  #else
  	GLuint		texnum;				// gl texture binding
  	GLint		internalFormat;
  	int			TMU;				// only needed for voodoo2
  #endif
  
  } image_t;
  
  // any change in the LIGHTMAP_* defines here MUST be reflected in
  // R_FindShader() in tr_bsp.c
  #define LIGHTMAP_2D         -4	// shader is for 2D rendering
  #define LIGHTMAP_BY_VERTEX  -3	// pre-lit triangle models
  #define LIGHTMAP_WHITEIMAGE -2
  #define LIGHTMAP_NONE       -1
  
  //extern	refimport_t		ri;
  extern glconfig_t	glConfig;		// outside of TR since it shouldn't be cleared during ref re-init
  
  // These variables should live inside glConfig but can't because of
  // compatibility issues to the original ID vms.  If you release a stand-alone
  // game and your mod uses tr_types.h from this build you can safely move them
  // to the glconfig_t struct.
  extern qboolean  textureFilterAnisotropic;
  extern int       maxAnisotropy;
  
  //
  // cvars
  //
  extern cvar_t *r_stencilbits;			// number of desired stencil bits
  extern cvar_t *r_texturebits;			// number of desired texture bits
  										// 0 = use framebuffer depth
  										// 16 = use 16-bit textures
  										// 32 = use 32-bit textures
  										// all else = error
  
  extern cvar_t *r_ignorehwgamma;			// overrides hardware gamma capabilities
  extern cvar_t *r_drawBuffer;
  
  extern cvar_t *r_allowExtensions;				// global enable/disable of OpenGL extensions
  extern cvar_t *r_ext_compressed_textures;		// these control use of specific extensions
  extern cvar_t *r_ext_multitexture;
  extern cvar_t *r_ext_compiled_vertex_array;
  extern cvar_t *r_ext_texture_env_add;
  
  extern cvar_t *r_ext_texture_filter_anisotropic;
  extern cvar_t *r_ext_max_anisotropy;
  
  float R_NoiseGet4f( float x, float y, float z, double t );
  void  R_NoiseInit( void );
  
  image_t *R_FindImageFile( const char *name, imgFlags_t flags );
  image_t *R_CreateImage( const char *name, byte *pic, int width, int height, imgFlags_t flags );
  
  void R_IssuePendingRenderCommands( void );
  qhandle_t RE_RegisterShaderLightMap( const char *name, int lightmapIndex );
  qhandle_t RE_RegisterShader( const char *name );
  qhandle_t RE_RegisterShaderNoMip( const char *name );
  qhandle_t RE_RegisterShaderFromImage(const char *name, int lightmapIndex, image_t *image, qboolean mipRawImage);
  
  // font stuff
  void R_InitFreeType( void );
  void R_DoneFreeType( void );
  void RE_RegisterFont(const char *fontName, int pointSize, fontInfo_t *font);
  
  /*
  =============================================================
  
  IMAGE LOADERS
  
  =============================================================
  */
  
  void R_LoadBMP( const char *name, byte **pic, int *width, int *height );
  void R_LoadJPG( const char *name, byte **pic, int *width, int *height );
  void R_LoadPCX( const char *name, byte **pic, int *width, int *height );
  void R_LoadPNG( const char *name, byte **pic, int *width, int *height );
  void R_LoadTGA( const char *name, byte **pic, int *width, int *height );
  
  /*
  ====================================================================
  
  IMPLEMENTATION SPECIFIC FUNCTIONS
  
  ====================================================================
  */
  
  #endif
  