08 Jul 2007

This commit is contained in:
g-cont 2007-07-08 00:00:00 +04:00 committed by Alibek Omarov
parent 7bd2d4d702
commit 9fc3c56bee
25 changed files with 4244 additions and 1141 deletions

View File

@ -1,4 +1,11 @@
Текущие задачи
1. Имплементация DDS загрузчика
{
DXT1 - форматы DXT1a и DXT1c - настроить оба типа загрузчиков
подключить загрузку мипмапов OK
подключить загрузку мипмапов для софт-загрузчика
Xash Studio: Xash Studio:
@ -31,20 +38,9 @@ launcher.dll
5. подключить кастомный хандлер для ошибок 5. подключить кастомный хандлер для ошибок
platform.dll platform.dll
1. пофиксить баг с неправильным именем лаунчера OK 1. разобраться наконец с записью файлов
2. разобраться наконец с записью файлов 2. переписать LoadJPG чтобы он читал из буффера OK
3. создать FS_Gets OK
4. FS_LoadImage, подключить палитру и bpp в структуре OK
5. подключить палитру к Jpg и Png файлам
6. написать MemMove, Memset, MemCopy
spritegen - апгрейд до версии 0.2 ОК
1. избавится от определения явных параметров OK
2. заменить groupstart\groupend на фигурные скобки ОК
3. убить группы и все что с ними связано OK
4. создать пустое изображение ОК
5. Переписать лоадер BMP ОК
6. Сделать динамическое выделение памяти OK
studiomdl - апгрейд до версии 0.2 studiomdl - апгрейд до версии 0.2
1. тщательный тест всех возможностей OK 1. тщательный тест всех возможностей OK
@ -55,12 +51,6 @@ platform.dll
1. сделать парсинг "ambient" из карты 1. сделать парсинг "ambient" из карты
2. сделать новый contents для Null 2. сделать новый contents для Null
qcclib
1. Первичная "сырая" имплементация.
2. Убить внутренние типы
3. Убить qcc_cmdlib
//================================================== //==================================================
// то, что уже готово // то, что уже готово

View File

@ -8,14 +8,6 @@
#include "baseutils.h" #include "baseutils.h"
#include "blankframe.h" #include "blankframe.h"
//=======================================================================
// BYTE ORDER FUNCTIONS
//=======================================================================
dword BuffBigLong (const byte *buffer){ return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];}
word BuffBigShort (const byte *buffer){ return (buffer[0] << 8) | buffer[1]; }
dword BuffLittleLong (const byte *buffer){ return (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0];}
word BuffLittleShort (const byte *buffer){return (buffer[1] << 8) | buffer[0];}
char *strupr (char *start) char *strupr (char *start)
{ {
char *in; char *in;

View File

@ -89,12 +89,6 @@ void FS_Shutdown (void);
#define Mem_Move(dest, src, size ) _Mem_Move (dest, src, size, __FILE__, __LINE__) #define Mem_Move(dest, src, size ) _Mem_Move (dest, src, size, __FILE__, __LINE__)
#define Mem_Copy(dest, src, size ) _Mem_Copy (dest, src, size, __FILE__, __LINE__) #define Mem_Copy(dest, src, size ) _Mem_Copy (dest, src, size, __FILE__, __LINE__)
//only for internal use
dword BuffBigLong (const byte *buffer);
word BuffBigShort (const byte *buffer);
dword BuffLittleLong (const byte *buffer);
word BuffLittleShort (const byte *buffer);
stdio_api_t std; stdio_api_t std;
extern gameinfo_t GI; extern gameinfo_t GI;

View File

@ -87,11 +87,56 @@ typedef struct
======================================================================== ========================================================================
*/ */
#define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0 #define DDSHEADER ((' '<<24)+('S'<<16)+('D'<<8)+'D') // little-endian "DDS "
#define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
#define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
#define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
//other four-cc types
#define TYPE_DXT1 (('1'<<24)+('T'<<16)+('X'<<8)+'D') // little-endian "DXT1"
#define TYPE_DXT2 (('2'<<24)+('T'<<16)+('X'<<8)+'D') // little-endian "DXT2"
#define TYPE_DXT3 (('3'<<24)+('T'<<16)+('X'<<8)+'D') // little-endian "DXT3"
#define TYPE_DXT4 (('4'<<24)+('T'<<16)+('X'<<8)+'D') // little-endian "DXT4"
#define TYPE_DXT5 (('5'<<24)+('T'<<16)+('X'<<8)+'D') // little-endian "DXT5"
#define TYPE_ATI1 (('1'<<24)+('I'<<16)+('T'<<8)+'A') // little-endian "ATI1"
#define TYPE_ATI2 (('2'<<24)+('I'<<16)+('T'<<8)+'A') // little-endian "ATI2"
#define TYPE_RXGB (('B'<<24)+('G'<<16)+('X'<<8)+'R') // little-endian "RXGB" doom3 normalmaps
#define TYPE_$ (('\0'<<24)+('\0'<<16)+('\0'<<8)+'$') // little-endian "$"
#define TYPE_o (('\0'<<24)+('\0'<<16)+('\0'<<8)+'o') // little-endian "o"
#define TYPE_p (('\0'<<24)+('\0'<<16)+('\0'<<8)+'p') // little-endian "p"
#define TYPE_q (('\0'<<24)+('\0'<<16)+('\0'<<8)+'q') // little-endian "q"
#define TYPE_r (('\0'<<24)+('\0'<<16)+('\0'<<8)+'r') // little-endian "r"
#define TYPE_s (('\0'<<24)+('\0'<<16)+('\0'<<8)+'s') // little-endian "s"
#define TYPE_t (('\0'<<24)+('\0'<<16)+('\0'<<8)+'t') // little-endian "t"
#define DDS_CAPS 0x00000001L
#define DDS_HEIGHT 0x00000002L
#define DDS_WIDTH 0x00000004L
#define DDS_RGB 0x00000040L
#define DDS_PIXELFORMAT 0x00001000L
#define DDS_LUMINANCE 0x00020000L
#define DDS_ALPHAPIXELS 0x00000001L
#define DDS_ALPHA 0x00000002L
#define DDS_FOURCC 0x00000004L
#define DDS_PITCH 0x00000008L
#define DDS_COMPLEX 0x00000008L
#define DDS_TEXTURE 0x00001000L
#define DDS_MIPMAPCOUNT 0x00020000L
#define DDS_LINEARSIZE 0x00080000L
#define DDS_VOLUME 0x00200000L
#define DDS_MIPMAP 0x00400000L
#define DDS_DEPTH 0x00800000L
//support cubemap loading
#define DDS_CUBEMAP 0x00000200L
#define DDS_CUBEMAP_POSITIVEX 0x00000400L
#define DDS_CUBEMAP_NEGATIVEX 0x00000800L
#define DDS_CUBEMAP_POSITIVEY 0x00001000L
#define DDS_CUBEMAP_NEGATIVEY 0x00002000L
#define DDS_CUBEMAP_POSITIVEZ 0x00004000L
#define DDS_CUBEMAP_NEGATIVEZ 0x00008000L
typedef struct dds_pf_s typedef struct dds_pf_s
{ {
@ -103,104 +148,33 @@ typedef struct dds_pf_s
uint dwGBitMask; uint dwGBitMask;
uint dwBBitMask; uint dwBBitMask;
uint dwAlphaBitMask; uint dwAlphaBitMask;
} dds_pf_t; } dds_pixf_t;
// DDCAPS2 // DDCAPS2
typedef struct dds_caps_s typedef struct dds_caps_s
{ {
uint dwCaps1; uint dwCaps1;
uint dwCaps2; uint dwCaps2;
uint dwDDSX; uint dwCaps3;
uint dwReserved; uint dwCaps4;
} dds_caps_t; } dds_caps_t;
typedef struct typedef struct
{ {
uint dwMagic; uint dwIdent; // must matched with DDSHEADER
uint dwSize; uint dwSize;
uint dwFlags; uint dwFlags; // determines what fields are valid
uint dwHeight; uint dwHeight;
uint dwWidth; uint dwWidth;
uint dwPitchOrLinearSize; uint dwLinearSize; // Formless late-allocated optimized surface size
uint dwDepth; uint dwDepth; // depth if a volume texture
uint dwMipMapCount; uint dwMipMapCount; // number of mip-map levels requested
uint dwReserved1[11]; uint dwAlphaBitDepth; // depth of alpha buffer requested
dds_pf_t ddpfPixelFormat; uint dwReserved1[10]; // reserved for future expansions
dds_caps_t ddsCaps; dds_pixf_t dsPixelFormat;
uint dwReserved2; dds_caps_t dsCaps;
uint dwTextureStage;
} dds_t; } dds_t;
/*
========================================================================
.PNG image format
========================================================================
*/
#define PNG_LIBPNG_VER_STRING "1.2.4"
#define PNG_COLOR_MASK_PALETTE 1
#define PNG_COLOR_MASK_COLOR 2
#define PNG_COLOR_MASK_ALPHA 4
#define PNG_COLOR_TYPE_GRAY 0
#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR)
#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)
#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA
#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA
#define PNG_INFO_tRNS 0x0010
extern void png_set_sig_bytes (void*, int);
extern int png_sig_cmp (const byte*, size_t, size_t);
extern void* png_create_read_struct (const char*, void*, void*, void*);
extern void* png_create_info_struct (void*);
extern void png_read_info (void*, void*);
extern void png_set_expand (void*);
extern void png_set_gray_1_2_4_to_8 (void*);
extern void png_set_palette_to_rgb (void*);
extern void png_set_tRNS_to_alpha (void*);
extern void png_set_gray_to_rgb (void*);
extern void png_set_filler (void*, unsigned int, int);
extern void png_read_update_info (void*, void*);
extern void png_read_image (void*, unsigned char**);
extern void png_read_end (void*, void*);
extern void png_destroy_read_struct (void**, void**, void**);
extern void png_set_read_fn (void*, void*, void*);
extern dword png_get_valid (void*, void*, unsigned int);
extern dword png_get_rowbytes (void*, void*);
extern byte png_get_channels (void*, void*);
extern byte png_get_bit_depth (void*, void*);
extern dword png_get_IHDR (void*, void*, dword*, dword*, int *, int *, int *, int *, int *);
extern char* png_get_libpng_ver (void*);
extern void png_set_strip_16 (void*);
static struct
{
const byte *tmpBuf;
int tmpBuflength;
int tmpi;
//int FBgColor;
//int FTransparent;
dword FRowBytes;
//double FGamma;
//double FScreenGamma;
byte **FRowPtrs;
byte *Data;
//char *Title;
//char *Author;
//char *Description;
int BitDepth;
int BytesPerPixel;
int ColorType;
unsigned int Height;
unsigned int Width;
int Interlace;
int Compression;
int Filter;
//double LastModified;
//int Transparent;
}png_buf;
/* /*
======================================================================== ========================================================================
@ -209,285 +183,57 @@ static struct
======================================================================== ========================================================================
*/ */
#define JPEG_LIB_VERSION 62 // Version 6b typedef struct huffman_table_s
typedef void *j_common_ptr;
typedef struct jpeg_compress_struct *j_compress_ptr;
typedef struct jpeg_decompress_struct *j_decompress_ptr;
typedef enum
{ {
JCS_UNKNOWN, // Huffman coding tables
JCS_GRAYSCALE, byte bits[16];
JCS_RGB, byte hval[256];
JCS_YCbCr, byte size[256];
JCS_CMYK, word code[256];
JCS_YCCK
}J_COLOR_SPACE;
typedef enum {JPEG_DUMMY1} J_DCT_METHOD; } huffman_table_t;
typedef enum {JPEG_DUMMY2} J_DITHER_MODE;
typedef dword JDIMENSION;
#define JPOOL_PERMANENT 0 // lasts until master record is destroyed typedef struct jpg_s
#define JPOOL_IMAGE 1 // lasts until done with image/datastream
#define JPEG_EOI 0xD9 // EOI marker code
#define JMSG_STR_PARM_MAX 80
#define DCTSIZE2 64
#define NUM_QUANT_TBLS 4
#define NUM_HUFF_TBLS 4
#define NUM_ARITH_TBLS 16
#define MAX_COMPS_IN_SCAN 4
#define C_MAX_BLOCKS_IN_MCU 10
#define D_MAX_BLOCKS_IN_MCU 10
struct jpeg_memory_mgr
{ {
void* (*alloc_small) (j_common_ptr cinfo, int pool_id, size_t sizeofobject); // Jpeg file parameter
void (*alloc_large) (); file_t *file; // file
void (*alloc_sarray) (); byte *buffer; // jpg buffer
void (*alloc_barray) ();
void (*request_virt_sarray) (); int width; // width image
void (*request_virt_barray) (); int height; // height image
void (*realize_virt_arrays) (); byte *data; // image
void (*access_virt_sarray) (); int data_precision; // bit per component
void (*access_virt_barray) (); int num_components; // number component
void (*free_pool) (); int restart_interval; // restart interval
void (*self_destruct) (); bool progressive_mode; // progressive format
long max_memory_to_use;
long max_alloc_chunk;
};
struct jpeg_error_mgr struct
{
void (*error_exit) (j_common_ptr cinfo);
void (*emit_message) (j_common_ptr cinfo, int msg_level);
void (*output_message) (j_common_ptr cinfo);
void (*format_message) (j_common_ptr cinfo, char * buffer);
void (*reset_error_mgr) (j_common_ptr cinfo);
int msg_code;
union
{ {
int i[8]; int id; // identifier
char s[JMSG_STR_PARM_MAX]; int h; // horizontal sampling factor
}msg_parm; int v; // vertical sampling factor
int t; // Quantization table selector
int td; // DC table selector
int ta; // AC table selector
} component_info[3];
huffman_table_t hac[4]; // AC table
huffman_table_t hdc[4]; // DC table
int trace_level; int qtable[4][64]; // Quantization table
long num_warnings;
const char * const * jpeg_message_table;
int last_jpeg_message;
const char * const * addon_message_table;
int first_addon_message;
int last_addon_message;
};
struct jpeg_source_mgr struct
{ {
const unsigned char *next_input_byte; int ss,se; // progressive jpeg spectral selection
size_t bytes_in_buffer; int ah,al; // progressive jpeg successive approx
} scan;
void (*init_source) (j_decompress_ptr cinfo); int dc[3];
jboolean (*fill_input_buffer) (j_decompress_ptr cinfo); int curbit;
void (*skip_input_data) (j_decompress_ptr cinfo, long num_bytes); byte curbyte;
jboolean (*resync_to_restart) (j_decompress_ptr cinfo, int desired);
void (*term_source) (j_decompress_ptr cinfo);
};
struct jpeg_decompress_struct } jpg_t;
{
struct jpeg_error_mgr *err; // USED
struct jpeg_memory_mgr *mem; // USED
void *progress; static jpg_t jpg_file;
void *client_data;
jboolean is_decompressor;
int global_state;
struct jpeg_source_mgr *src; // USED
JDIMENSION image_width; // USED
JDIMENSION image_height; // USED
int num_components;
J_COLOR_SPACE jpeg_color_space;
J_COLOR_SPACE out_color_space;
dword scale_num, scale_denom;
double output_gamma;
jboolean buffered_image;
jboolean raw_data_out;
J_DCT_METHOD dct_method;
jboolean do_fancy_upsampling;
jboolean do_block_smoothing;
jboolean quantize_colors;
J_DITHER_MODE dither_mode;
jboolean two_pass_quantize;
int desired_number_of_colors;
jboolean enable_1pass_quant;
jboolean enable_external_quant;
jboolean enable_2pass_quant;
JDIMENSION output_width;
JDIMENSION output_height; // USED
int out_color_components;
int output_components; // USED
int rec_outbuf_height;
int actual_number_of_colors;
void *colormap;
JDIMENSION output_scanline; // USED
int input_scan_number;
JDIMENSION input_iMCU_row;
int output_scan_number;
JDIMENSION output_iMCU_row;
int (*coef_bits)[DCTSIZE2];
void *quant_tbl_ptrs[NUM_QUANT_TBLS];
void *dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
void *ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
int data_precision;
void *comp_info;
jboolean progressive_mode;
jboolean arith_code;
byte arith_dc_L[NUM_ARITH_TBLS];
byte arith_dc_U[NUM_ARITH_TBLS];
byte arith_ac_K[NUM_ARITH_TBLS];
dword restart_interval;
jboolean saw_JFIF_marker;
byte JFIF_major_version;
byte JFIF_minor_version;
byte density_unit;
word X_density;
word Y_density;
jboolean saw_Adobe_marker;
byte Adobe_transform;
jboolean CCIR601_sampling;
void *marker_list;
int max_h_samp_factor;
int max_v_samp_factor;
int min_DCT_scaled_size;
JDIMENSION total_iMCU_rows;
void *sample_range_limit;
int comps_in_scan;
void *cur_comp_info[MAX_COMPS_IN_SCAN];
JDIMENSION MCUs_per_row;
JDIMENSION MCU_rows_in_scan;
int blocks_in_MCU;
int MCU_membership[D_MAX_BLOCKS_IN_MCU];
int Ss, Se, Ah, Al;
int unread_marker;
void *master;
void *main;
void *coef;
void *post;
void *inputctl;
void *marker;
void *entropy;
void *idct;
void *upsample;
void *cconvert;
void *cquantize;
};
struct jpeg_compress_struct
{
struct jpeg_error_mgr *err;
struct jpeg_memory_mgr *mem;
void *progress;
void *client_data;
jboolean is_decompressor;
int global_state;
void *dest;
JDIMENSION image_width;
JDIMENSION image_height;
int input_components;
J_COLOR_SPACE in_color_space;
double input_gamma;
int data_precision;
int num_components;
J_COLOR_SPACE jpeg_color_space;
void *comp_info;
void *quant_tbl_ptrs[NUM_QUANT_TBLS];
void *dc_huff_tbl_ptrs[NUM_HUFF_TBLS];
void *ac_huff_tbl_ptrs[NUM_HUFF_TBLS];
byte arith_dc_L[NUM_ARITH_TBLS];
byte arith_dc_U[NUM_ARITH_TBLS];
byte arith_ac_K[NUM_ARITH_TBLS];
int num_scans;
const void *scan_info;
jboolean raw_data_in;
jboolean arith_code;
jboolean optimize_coding;
jboolean CCIR601_sampling;
int smoothing_factor;
J_DCT_METHOD dct_method;
dword restart_interval;
int restart_in_rows;
jboolean write_JFIF_header;
byte JFIF_major_version;
byte JFIF_minor_version;
byte density_unit;
word X_density;
word Y_density;
jboolean write_Adobe_marker;
JDIMENSION next_scanline;
jboolean progressive_mode;
int max_h_samp_factor;
int max_v_samp_factor;
JDIMENSION total_iMCU_rows;
int comps_in_scan;
void *cur_comp_info[MAX_COMPS_IN_SCAN];
JDIMENSION MCUs_per_row;
JDIMENSION MCU_rows_in_scan;
int blocks_in_MCU;
int MCU_membership[C_MAX_BLOCKS_IN_MCU];
int Ss, Se, Ah, Al;
void *master;
void *main;
void *prep;
void *coef;
void *marker;
void *cconvert;
void *downsample;
void *fdct;
void *entropy;
void *script_space;
int script_space_size;
};
struct jpeg_destination_mgr
{
byte* next_output_byte;
size_t free_in_buffer;
void (*init_destination) (j_compress_ptr cinfo);
jboolean (*empty_output_buffer) (j_compress_ptr cinfo);
void (*term_destination) (j_compress_ptr cinfo);
};
#define jpeg_create_compress(cinfo) jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, (size_t) sizeof(struct jpeg_compress_struct))
#define jpeg_create_decompress(cinfo) jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, (size_t) sizeof(struct jpeg_decompress_struct))
extern void jpeg_CreateCompress (j_compress_ptr cinfo, int version, size_t structsize);
extern void jpeg_CreateDecompress (j_decompress_ptr cinfo, int version, size_t structsize);
extern void jpeg_destroy_compress (j_compress_ptr cinfo);
extern void jpeg_destroy_decompress (j_decompress_ptr cinfo);
extern void jpeg_finish_compress (j_compress_ptr cinfo);
extern jboolean jpeg_finish_decompress (j_decompress_ptr cinfo);
extern jboolean jpeg_resync_to_restart (j_decompress_ptr cinfo, int desired);
extern int jpeg_read_header (j_decompress_ptr cinfo, jboolean require_image);
extern JDIMENSION jpeg_read_scanlines (j_decompress_ptr cinfo, unsigned char** scanlines, JDIMENSION max_lines);
extern void jpeg_set_defaults (j_compress_ptr cinfo);
extern void jpeg_set_quality (j_compress_ptr cinfo, int quality, jboolean force_baseline);
extern jboolean jpeg_start_compress (j_compress_ptr cinfo, jboolean write_all_tables);
extern jboolean jpeg_start_decompress (j_decompress_ptr cinfo);
extern struct jpeg_error_mgr* jpeg_std_error (struct jpeg_error_mgr *err);
extern JDIMENSION jpeg_write_scanlines (j_compress_ptr cinfo, unsigned char** scanlines, JDIMENSION num_lines);
#endif//IMAGE_H #endif//IMAGE_H

Binary file not shown.

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1,18 +0,0 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// image.h - tga, pcx image headers
//=======================================================================
#ifndef IMGLIB_H
#define IMGLIB_H
#include "platform.h"
bool LoadBMP( char *name, char *buffer, int filesize );
bool LoadPCX( char *name, char *buffer, int filesize );
bool LoadTGA( char *name, char *buffer, int filesize );
bool LoadDDS( char *name, char *buffer, int filesize );
bool LoadPNG( char *name, char *buffer, int filesize );
bool LoadJPG( char *name, char *buffer, int filesize );
#endif//IMGLIB_H

View File

@ -249,10 +249,6 @@ SOURCE=.\image.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\imglib.h
# End Source File
# Begin Source File
SOURCE=.\mdllib.h SOURCE=.\mdllib.h
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -36,19 +36,14 @@ typedef struct file_s file_t;
typedef struct edict_s edict_t; typedef struct edict_s edict_t;
typedef struct gclient_s gclient_t; typedef struct gclient_s gclient_t;
typedef float vec_t; typedef float vec_t;
typedef byte jboolean;
typedef vec_t vec3_t[3]; typedef vec_t vec3_t[3];
typedef vec_t vec4_t[4]; typedef vec_t vec4_t[4];
typedef long fs_offset_t; typedef long fs_offset_t;
typedef vec_t matrix3x4[3][4]; typedef vec_t matrix3x4[3][4];
typedef struct { int fileofs; int filelen; }lump_t; typedef struct { int fileofs; int filelen; }lump_t;
typedef struct { byte r; byte g; byte b; } color24;
typedef struct { uint b:5; uint g:6; uint r:5; } color16;
#define BigShort(l) ShortSwap(l) typedef struct { byte r; byte g; byte b; byte a; } color32;
#define BigLong(l) LongSwap(l)
#define LittleShort(l) (l)
#define LittleLong(l) (l)
#define LittleFloat(l) (l)
#ifndef NULL #ifndef NULL
#define NULL ((void *)0) #define NULL ((void *)0)
@ -59,12 +54,7 @@ typedef struct { int fileofs; int filelen; }lump_t;
#define O_NONBLOCK 0 #define O_NONBLOCK 0
#endif #endif
_inline short ShortSwap (short l) { byte b1,b2; b1 = l&255; b2 = (l>>8)&255; return (b1<<8) + b2; } #include "byteorder.h"
_inline int LongSwap (int l)
{
byte b1,b2,b3,b4; b1 = l&255; b2 = (l>>8)&255; b3 = (l>>16)&255; b4 = (l>>24)&255;
return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4;
}
#ifdef WIN32 #ifdef WIN32
#define strcasecmp stricmp #define strcasecmp stricmp

153
public/byteorder.h Normal file
View File

@ -0,0 +1,153 @@
//=======================================================================
// Copyright XashXT Group 2007 ©
// byteorder.h - byte order functions
//=======================================================================
#ifndef BYTEORDER_H
#define BYTEORDER_H
#include "basetypes.h"
//byte order swap functions
_inline word WordSwap( word swap )
{
word *s = &swap;
__asm {
mov ebx, s
mov al, [ebx+1]
mov ah, [ebx ]
mov [ebx], ax
}
return *s;
}
#define ShortSwap(x) WordSwap((short)x)
_inline uint UintSwap( uint swap )
{
uint *i = &swap;
__asm {
mov ebx, i
mov eax, [ebx]
bswap eax
mov [ebx], eax
}
return *i;
}
#define LongSwap(x) UintSwap((uint)x)
#define FloatSwap(x) UintSwap((uint)x)
_inline double DoubleSwap( double swap )
{
#define dswap(x, y) t=b[x];b[x]=b[y];b[y]=b[x];
byte t, *b = ((byte *)&swap);
dswap(0,7);
dswap(1,6);
dswap(2,5);
dswap(3,4);
return swap;
}
//============================================================================
// Endianess handling
//============================================================================
// We use BSD-style defines: BYTE_ORDER is defined to either BIG_ENDIAN or LITTLE_ENDIAN
// Initializations
#if !defined(BYTE_ORDER) || !defined(LITTLE_ENDIAN) || !defined(BIG_ENDIAN) || (BYTE_ORDER != LITTLE_ENDIAN && BYTE_ORDER != BIG_ENDIAN)
#undef BYTE_ORDER
#undef LITTLE_ENDIAN
#undef BIG_ENDIAN
#define LITTLE_ENDIAN 1234
#define BIG_ENDIAN 4321
#endif
// If we still don't know the CPU endianess at this point, we try to guess
#ifndef BYTE_ORDER
#if defined(WIN32)
#define BYTE_ORDER LITTLE_ENDIAN
#else
#if defined(SUNOS)
#if defined(__i386) || defined(__amd64)
#define BYTE_ORDER LITTLE_ENDIAN
#else
#define BYTE_ORDER BIG_ENDIAN
#endif
#else
#warning "Unable to determine the CPU endianess. Defaulting to little endian"
#define BYTE_ORDER LITTLE_ENDIAN
#endif
#endif
#endif
#if BYTE_ORDER == LITTLE_ENDIAN
// little endian
#define BigShort(l) ShortSwap(l)
#define LittleShort(l) (l)
#define BigLong(l) LongSwap(l)
#define LittleLong(l) (l)
#define BigFloat(l) FloatSwap(l)
#define LittleFloat(l) (l)
#define BigDouble(l) DoubleSwap(l)
#define LittleDouble(l) (l)
#else
// big endian
#define BigShort(l) (l)
#define LittleShort(l) ShortSwap(l)
#define BigLong(l) (l)
#define LittleLong(l) LongSwap(l)
#define BigFloat(l) (l)
#define LittleFloat(l) FloatSwap(l)
#define BigDouble(l) (l)
#define LittleDouble(l) DoubleSwap(l)
#endif
//extract from buffer
_inline dword BuffBigLong (const byte *buffer)
{
return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];
}
_inline word BuffBigShort (const byte *buffer)
{
return (buffer[0] << 8) | buffer[1];
}
_inline float BuffBigFloat (const byte *buffer)
{
return BuffBigLong( buffer );//same as integer
}
_inline double BuffBigDouble (const byte *buffer)
{
return (buffer[0] << 64) | (buffer[1] << 56) | (buffer[2] << 40) | (buffer[3] << 32)
| (buffer[4] << 24) | (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];
}
_inline dword BuffLittleLong (const byte *buffer)
{
return (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0];
}
_inline word BuffLittleShort (const byte *buffer)
{
return (buffer[1] << 8) | buffer[0];
}
_inline float BuffLittleFloat (const byte *buffer)
{
return BuffLittleLong( buffer );
}
_inline double BuffLittleDouble (const byte *buffer)
{
return (buffer[7] << 64) | (buffer[6] << 56) | (buffer[5] << 40) | (buffer[4] << 32)
| (buffer[3] << 24) | (buffer[2] << 16) | (buffer[1] << 8) | buffer[0];
}
#endif//BYTEORDER_H

View File

@ -11,6 +11,82 @@
#define BSP_ONLYRAD 0x04 #define BSP_ONLYRAD 0x04
#define BSP_FULLCOMPILE 0x08 #define BSP_FULLCOMPILE 0x08
enum comp_format
{
PF_UNKNOWN = 0,
PF_INDEXED_8, // pcx or wal images with transparent color in palette
PF_INDEXED_24, // studio model skins
PF_INDEXED_32, // sprite 32-bit palette
PF_RGBA_32, // already prepared ".bmp", ".tga" or ".jpg" image
PF_ARGB_32, // uncompressed dds image
PF_RGB_24, // uncompressed dds or another 24-bit image
PF_DXT1, // nvidia DXT5 format
PF_DXT2, // nvidia DXT5 format
PF_DXT3, // nvidia DXT5 format
PF_DXT4, // nvidia DXT5 format
PF_DXT5, // nvidia DXT5 format
PF_3DC,
PF_ATI1N, // ati 1D texture
PF_LUMINANCE, // b&w dds image
PF_LUMINANCE_16, // b&w hi-res image
PF_LUMINANCE_ALPHA, // b&w dds image with alpha channel
PF_RXGB, // doom3 normal maps
PF_ABGR_64,
PF_R_16F,
PF_GR_32F,
PF_ABGR_64F,
PF_R_32F,
PF_GR_64F,
PF_ABGR_128F, // super-texture
PF_PROCEDURE_TEX, // internal special texture
PF_TOTALCOUNT, // must be last
};
//format info table
typedef struct
{
int format; // pixelformat
char name[8]; // used for debug
int bpp; // channels (e.g. rgb = 3, rgba = 4)
int bpc; // sizebytes (byte, short, float)
int block; // blocksize > 0 needs alternate calc
} bpc_desc_t;
static bpc_desc_t PixelFormatDescription[] =
{
{PF_INDEXED_8, "pal 8", 4, 1, 0 },
{PF_INDEXED_24, "pal 24", 3, 1, -3 },
{PF_INDEXED_32, "pal 32", 4, 1, -4 },
{PF_RGBA_32, "RGBA", 4, 1, -4 },
{PF_ARGB_32, "ARGB", 4, 1, -4 },
{PF_RGB_24, "RGB", 3, 1, -3 },
{PF_DXT1, "DXT1", 4, 1, 8 },
{PF_DXT2, "DXT2", 4, 1, 16 },
{PF_DXT3, "DXT3", 4, 1, 16 },
{PF_DXT4, "DXT4", 4, 1, 16 },
{PF_DXT5, "DXT5", 4, 1, 16 },
{PF_3DC, "3DC", 3, 1, 16 },
{PF_ATI1N, "ATI1N", 1, 1, 8 },
{PF_LUMINANCE, "LUM 8", 1, 1, -1 },
{PF_LUMINANCE_16, "LUM 16", 2, 2, -2 },
{PF_LUMINANCE_ALPHA,"LUM A", 2, 1, -2 },
{PF_RXGB, "RXGB", 3, 1, 16 },
{PF_ABGR_64, "ABGR", 4, 2, -8 },
{PF_R_16F, "R_16", 1, 4, -2 },
{PF_GR_32F, "GR_32", 2, 4, -4 },
{PF_ABGR_64F, "ABGR64", 4, 2, -8 },
{PF_R_32F, "R_32", 1, 4, -4 },
{PF_GR_64F, "GR_64", 2, 4, -8 },
{PF_ABGR_128F, "ABGR128",4, 4, -16},
{PF_PROCEDURE_TEX, "system", 4, 1, -32},
{PF_UNKNOWN, "", 0, 0, 0 },
};
#define IMAGE_CUBEMAP 0x00000001
#define IMAGE_HAS_ALPHA 0x00000002
#define IMAGE_PREMULT 0x00000004 // indices who need in additional premultiply
#define IMAGE_GEN_MIPS 0x00000008 // must generate mips
typedef struct search_s typedef struct search_s
{ {
int numfilenames; int numfilenames;
@ -22,9 +98,10 @@ typedef struct rgbdata_s
{ {
word width; // image width word width; // image width
word height; // image height word height; // image height
byte bitsperpixel; // 8-16-24-32 bits byte numLayers; // multi-layer volume
word alpha; // has alpha pixels byte numMips; // mipmap count
uint compression; // DXT compression uint type; // compression type
uint flags; // misc image flags
byte *palette; // palette if present byte *palette; // palette if present
byte *buffer; // image buffer byte *buffer; // image buffer
} rgbdata_t; } rgbdata_t;

View File

@ -324,6 +324,7 @@ void GL_MBind( GLenum target, int texnum );
void GL_TexEnv( GLenum value ); void GL_TexEnv( GLenum value );
void GL_EnableMultitexture( bool enable ); void GL_EnableMultitexture( bool enable );
void GL_SelectTexture( GLenum ); void GL_SelectTexture( GLenum );
void GL_TexFilter( GLboolean mipmap );
void R_LightPoint (vec3_t p, vec3_t color); void R_LightPoint (vec3_t p, vec3_t color);
void R_PushDlights (void); void R_PushDlights (void);
@ -450,6 +451,7 @@ typedef struct
bool allow_cds; bool allow_cds;
bool sgis_generate_mipmap; bool sgis_generate_mipmap;
bool arb_compressed_teximage;
} glconfig_t; } glconfig_t;
typedef struct typedef struct
@ -564,4 +566,9 @@ void AngleQuaternion( float *angles, vec4_t quaternion );
void QuaternionMatrix( vec4_t quaternion, float (*matrix)[4] ); void QuaternionMatrix( vec4_t quaternion, float (*matrix)[4] );
void QuaternionSlerp( vec4_t p, vec4_t q, float t, vec4_t qt ); void QuaternionSlerp( vec4_t p, vec4_t q, float t, vec4_t qt );
void AngleMatrix (const float *angles, float (*matrix)[4] ); void AngleMatrix (const float *angles, float (*matrix)[4] );
void MatrixCopy( matrix3x4 in, matrix3x4 out ); void MatrixCopy( matrix3x4 in, matrix3x4 out );
uint ShortToFloat( word y );
void R_DXTReadColor(word data, color32* out);
void R_DXTReadColors(const byte* data, color32* out);
void R_GetBitsFromMask(uint Mask, uint *ShiftLeft, uint *ShiftRight);

View File

@ -1146,14 +1146,15 @@ int R_Init( void *hinstance, void *hWnd )
if (strstr( gl_config.extensions_string, "GL_ARB_texture_compression" )) if (strstr( gl_config.extensions_string, "GL_ARB_texture_compression" ))
{ {
qglCompressedTexImage2DARB = ( void *) qwglGetProcAddress("glCompressedTexImage2DARB"); if (strstr( gl_config.extensions_string, "GL_EXT_texture_compression_s3tc" ))
qglGetCompressedTexImageARB = ( void *) qwglGetProcAddress("glGetCompressedTexImageARB");
if (!qglCompressedTexImage2DARB || !qglGetCompressedTexImageARB)
{ {
qglCompressedTexImage2DARB = NULL; qglCompressedTexImage2D = ( void *)qwglGetProcAddress("glCompressedTexImage2DARB");
qglGetCompressedTexImageARB = NULL; qglGetCompressedTexImage = ( void *)qwglGetProcAddress("glGetCompressedTexImageARB");
} }
if (qglCompressedTexImage2D && qglGetCompressedTexImage)
gl_config.arb_compressed_teximage = true;
else gl_config.arb_compressed_teximage = false;
} }
if ( strstr( gl_config.extensions_string, "GL_EXT_point_parameters" ) ) if ( strstr( gl_config.extensions_string, "GL_EXT_point_parameters" ) )

View File

@ -60,9 +60,9 @@ void R_InitParticleTexture (void)
} }
r_tex.width = 8; r_tex.width = 8;
r_tex.height = 8; r_tex.height = 8;
r_tex.bitsperpixel = 32; r_tex.type = PF_PROCEDURE_TEX;
r_tex.compression = 0; r_tex.flags |= IMAGE_HAS_ALPHA;
r_tex.alpha = true; r_tex.numMips = 4;
r_tex.palette = NULL; r_tex.palette = NULL;
r_tex.buffer = (byte *)data; r_tex.buffer = (byte *)data;
@ -81,7 +81,7 @@ void R_InitParticleTexture (void)
data[y][x][3] = 255; data[y][x][3] = 255;
} }
} }
r_tex.alpha = false;//notexture don't have alpha r_tex.flags &= ~IMAGE_HAS_ALPHA;//notexture don't have alpha
r_notexture = R_LoadImage("***r_notexture***", &r_tex, it_wall ); r_notexture = R_LoadImage("***r_notexture***", &r_tex, it_wall );
R_Bloom_InitTextures(); R_Bloom_InitTextures();

View File

@ -399,8 +399,8 @@ void ( APIENTRY * qglViewport )(GLint x, GLint y, GLsizei width, GLsizei height)
void ( APIENTRY * qglLockArraysEXT)( int, int); void ( APIENTRY * qglLockArraysEXT)( int, int);
void ( APIENTRY * qglUnlockArraysEXT) ( void ); void ( APIENTRY * qglUnlockArraysEXT) ( void );
void (APIENTRY *qglCompressedTexImage2DARB)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data); void (APIENTRY *qglCompressedTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);
void ( APIENTRY *qglGetCompressedTexImageARB) (GLenum target, GLint lod, const GLvoid* img); void ( APIENTRY *qglGetCompressedTexImage) (GLenum target, GLint lod, const GLvoid* img);
BOOL ( WINAPI * qwglSwapIntervalEXT)( int interval ); BOOL ( WINAPI * qwglSwapIntervalEXT)( int interval );
BOOL ( WINAPI * qwglGetDeviceGammaRampEXT)( unsigned char *, unsigned char *, unsigned char * ); BOOL ( WINAPI * qwglGetDeviceGammaRampEXT)( unsigned char *, unsigned char *, unsigned char * );

View File

@ -331,6 +331,25 @@ void GL_TexEnv( GLenum mode )
} }
} }
/*
===============
GL_TexFilter
===============
*/
void GL_TexFilter( GLboolean mipmap )
{
if (mipmap)
{
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_min);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
}
else
{
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, gl_filter_max);
qglTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, gl_filter_max);
}
}
/* /*
=============== ===============
GL_Bind GL_Bind

View File

@ -106,9 +106,9 @@ void R_Bloom_InitBackUpTexture( int width, int height )
memset( data, 0, width * height * 4 ); memset( data, 0, width * height * 4 );
r_bloom.width = width; r_bloom.width = width;
r_bloom.height = height; r_bloom.height = height;
r_bloom.bitsperpixel = 3; r_bloom.type = PF_PROCEDURE_TEX;
r_bloom.compression = 0; r_bloom.flags = 0;
r_bloom.alpha = false; r_bloom.numMips = 4;
r_bloom.palette = NULL; r_bloom.palette = NULL;
r_bloom.buffer = data; r_bloom.buffer = data;
@ -155,9 +155,9 @@ void R_Bloom_InitEffectTexture( void )
r_bloomfx.width = BLOOM_SIZE; r_bloomfx.width = BLOOM_SIZE;
r_bloomfx.height = BLOOM_SIZE; r_bloomfx.height = BLOOM_SIZE;
r_bloomfx.bitsperpixel = 3; r_bloomfx.type = PF_PROCEDURE_TEX;
r_bloomfx.compression = 0; r_bloomfx.flags = 0;
r_bloomfx.alpha = false; r_bloomfx.numMips = 4;
r_bloomfx.palette = NULL; r_bloomfx.palette = NULL;
r_bloomfx.buffer = data; r_bloomfx.buffer = data;
r_bloomeffecttexture = R_LoadImage( "***r_bloomeffecttexture***", &r_bloomfx, it_pic ); r_bloomeffecttexture = R_LoadImage( "***r_bloomeffecttexture***", &r_bloomfx, it_pic );
@ -195,11 +195,11 @@ void R_Bloom_InitTextures( void )
memset( data, 255, size ); memset( data, 255, size );
r_bloomscr.width = screen_texture_width; r_bloomscr.width = screen_texture_width;
r_bloomscr.height = screen_texture_height; r_bloomscr.height = screen_texture_height;
r_bloomscr.bitsperpixel = 3; r_bloomscr.type = 0;
r_bloomscr.compression = 0; r_bloomscr.flags = 0;
r_bloomscr.alpha = 0;
r_bloomscr.palette = NULL; r_bloomscr.palette = NULL;
r_bloomscr.buffer = (byte *)data; r_bloomscr.buffer = (byte *)data;
r_bloomscr.numMips = 4;
r_bloomscreentexture = R_LoadImage( "***r_bloomscreentexture***", &r_bloomscr, it_pic ); r_bloomscreentexture = R_LoadImage( "***r_bloomscreentexture***", &r_bloomscr, it_pic );
free ( data ); free ( data );
@ -216,11 +216,11 @@ void R_Bloom_InitTextures( void )
memset( data, 0, r_screendownsamplingtexture_size * r_screendownsamplingtexture_size * 4 ); memset( data, 0, r_screendownsamplingtexture_size * r_screendownsamplingtexture_size * 4 );
r_downsample.width = r_screendownsamplingtexture_size; r_downsample.width = r_screendownsamplingtexture_size;
r_downsample.height = r_screendownsamplingtexture_size; r_downsample.height = r_screendownsamplingtexture_size;
r_downsample.bitsperpixel = 3; r_downsample.type = PF_PROCEDURE_TEX;
r_downsample.compression = 0; r_downsample.flags = 0;
r_downsample.alpha = false;
r_downsample.palette = NULL; r_downsample.palette = NULL;
r_downsample.buffer = (byte *)data; r_downsample.buffer = (byte *)data;
r_downsample.numMips = 4;
r_bloomdownsamplingtexture = R_LoadImage( "***r_bloomdownsampetexture***", &r_downsample, it_pic ); r_bloomdownsamplingtexture = R_LoadImage( "***r_bloomdownsampetexture***", &r_downsample, it_pic );
free ( data ); free ( data );
} }

View File

@ -447,20 +447,25 @@ extern BOOL ( WINAPI * qwglSetDeviceGammaRampEXT ) ( const unsigned char *pRed,
#ifndef GL_ARB_texture_compression #ifndef GL_ARB_texture_compression
#define GL_ARB_texture_compression 1 #define GL_ARB_texture_compression 1
#define GL_COMPRESSED_ALPHA_ARB 0x84E9 #define GL_COMPRESSED_RGB_S3TC_DXT1_EXT 0x83F0
#define GL_COMPRESSED_LUMINANCE_ARB 0x84EA #define GL_COMPRESSED_RGBA_S3TC_DXT1_EXT 0x83F1
#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB #define GL_COMPRESSED_RGBA_S3TC_DXT3_EXT 0x83F2
#define GL_COMPRESSED_INTENSITY_ARB 0x84EC #define GL_COMPRESSED_RGBA_S3TC_DXT5_EXT 0x83F3
#define GL_COMPRESSED_RGB_ARB 0x84ED
#define GL_COMPRESSED_RGBA_ARB 0x84EE
#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
#define GL_TEXTURE_COMPRESSED_ARB 0x86A1
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
extern void (APIENTRY *qglCompressedTexImage2DARB)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data); #define GL_COMPRESSED_ALPHA_ARB 0x84E9
extern void ( APIENTRY *qglGetCompressedTexImageARB) (GLenum target, GLint lod, const GLvoid* img); #define GL_COMPRESSED_LUMINANCE_ARB 0x84EA
#define GL_COMPRESSED_LUMINANCE_ALPHA_ARB 0x84EB
#define GL_COMPRESSED_INTENSITY_ARB 0x84EC
#define GL_COMPRESSED_RGB_ARB 0x84ED
#define GL_COMPRESSED_RGBA_ARB 0x84EE
#define GL_TEXTURE_COMPRESSION_HINT_ARB 0x84EF
#define GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB 0x86A0
#define GL_TEXTURE_COMPRESSED_ARB 0x86A1
#define GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A2
#define GL_COMPRESSED_TEXTURE_FORMATS_ARB 0x86A3
extern void (APIENTRY *qglCompressedTexImage2D)(GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLsizei imageSize, const GLvoid* data);
extern void ( APIENTRY *qglGetCompressedTexImage) (GLenum target, GLint lod, const GLvoid* img);
#endif /* GL_ARB_texture_compression */ #endif /* GL_ARB_texture_compression */

View File

@ -48,9 +48,9 @@ void *R_SpriteLoadFrame (model_t *mod, void *pin, mspriteframe_t **ppframe, int
pspriteframe->left = origin[0]; pspriteframe->left = origin[0];
pspriteframe->right = width + origin[0]; pspriteframe->right = width + origin[0];
pspriteframe->texnum = 0; pspriteframe->texnum = 0;
r_frame.compression = 0; r_frame.type = PF_INDEXED_32;
r_frame.bitsperpixel = 32; r_frame.numMips = 4;
r_frame.alpha = true; r_frame.flags |= IMAGE_HAS_ALPHA;
//extract sprite name from path //extract sprite name from path
ri.FS_FileBase( mod->name, name ); ri.FS_FileBase( mod->name, name );

View File

@ -90,9 +90,9 @@ image_t *R_StudioLoadTexture( model_t *mod, mstudiotexture_t *ptexture, byte *pi
r_skin.width = ptexture->width; r_skin.width = ptexture->width;
r_skin.height = ptexture->height; r_skin.height = ptexture->height;
r_skin.alpha = (ptexture->flags & STUDIO_NF_TRANSPARENT) ? true : false; r_skin.flags |= (ptexture->flags & STUDIO_NF_TRANSPARENT) ? IMAGE_HAS_ALPHA : 0;
r_skin.bitsperpixel = 24; r_skin.type = PF_INDEXED_24;
r_skin.compression = 0; r_skin.numMips = 4;
r_skin.palette = pin + ptexture->width * ptexture->height + ptexture->index; r_skin.palette = pin + ptexture->width * ptexture->height + ptexture->index;
r_skin.buffer = pin + ptexture->index; //texdata r_skin.buffer = pin + ptexture->index; //texdata

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -137,24 +137,15 @@ R_ConcatRotations
*/ */
void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3]) void R_ConcatRotations (float in1[3][3], float in2[3][3], float out[3][3])
{ {
out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + out[0][0] = in1[0][0] * in2[0][0] + in1[0][1] * in2[1][0] + in1[0][2] * in2[2][0];
in1[0][2] * in2[2][0]; out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + in1[0][2] * in2[2][1];
out[0][1] = in1[0][0] * in2[0][1] + in1[0][1] * in2[1][1] + out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + in1[0][2] * in2[2][2];
in1[0][2] * in2[2][1]; out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + in1[1][2] * in2[2][0];
out[0][2] = in1[0][0] * in2[0][2] + in1[0][1] * in2[1][2] + out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + in1[1][2] * in2[2][1];
in1[0][2] * in2[2][2]; out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] + in1[1][2] * in2[2][2];
out[1][0] = in1[1][0] * in2[0][0] + in1[1][1] * in2[1][0] + out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] + in1[2][2] * in2[2][0];
in1[1][2] * in2[2][0]; out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] + in1[2][2] * in2[2][1];
out[1][1] = in1[1][0] * in2[0][1] + in1[1][1] * in2[1][1] + out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] + in1[2][2] * in2[2][2];
in1[1][2] * in2[2][1];
out[1][2] = in1[1][0] * in2[0][2] + in1[1][1] * in2[1][2] +
in1[1][2] * in2[2][2];
out[2][0] = in1[2][0] * in2[0][0] + in1[2][1] * in2[1][0] +
in1[2][2] * in2[2][0];
out[2][1] = in1[2][0] * in2[0][1] + in1[2][1] * in2[1][1] +
in1[2][2] * in2[2][1];
out[2][2] = in1[2][0] * in2[0][2] + in1[2][1] * in2[1][2] +
in1[2][2] * in2[2][2];
} }
@ -352,4 +343,123 @@ MatrixCopy
void MatrixCopy( matrix3x4 in, matrix3x4 out ) void MatrixCopy( matrix3x4 in, matrix3x4 out )
{ {
memcpy( out, in, sizeof( matrix3x4 )); memcpy( out, in, sizeof( matrix3x4 ));
}
/*
====================
Image Decompress
ShortToFloat
====================
*/
uint ShortToFloat( word y )
{
int s = (y >> 15) & 0x00000001;
int e = (y >> 10) & 0x0000001f;
int m = y & 0x000003ff;
if (e == 0)
{
if (m == 0) return s << 31; // Plus or minus zero
else // Denormalized number -- renormalize it
{
while (!(m & 0x00000400))
{
m <<= 1;
e -= 1;
}
e += 1;
m &= ~0x00000400;
}
}
else if (e == 31)
{
if (m == 0) return (s << 31) | 0x7f800000; // Positive or negative infinity
else return (s << 31) | 0x7f800000 | (m << 13); // Nan -- preserve sign and significand bits
}
// Normalized number
e = e + (127 - 15);
m = m << 13;
return (s << 31) | (e << 23) | m; // Assemble s, e and m.
}
/*
====================
Image Decompress
read colors from dxt image
====================
*/
void R_DXTReadColors(const byte* data, color32* out)
{
byte r0, g0, b0, r1, g1, b1;
b0 = data[0] & 0x1F;
g0 = ((data[0] & 0xE0) >> 5) | ((data[1] & 0x7) << 3);
r0 = (data[1] & 0xF8) >> 3;
b1 = data[2] & 0x1F;
g1 = ((data[2] & 0xE0) >> 5) | ((data[3] & 0x7) << 3);
r1 = (data[3] & 0xF8) >> 3;
out[0].r = r0 << 3;
out[0].g = g0 << 2;
out[0].b = b0 << 3;
out[1].r = r1 << 3;
out[1].g = g1 << 2;
out[1].b = b1 << 3;
}
/*
====================
Image Decompress
read one color from dxt image
====================
*/
void R_DXTReadColor(word data, color32* out)
{
byte r, g, b;
b = data & 0x1f;
g = (data & 0x7E0) >>5;
r = (data & 0xF800)>>11;
out->r = r << 3;
out->g = g << 2;
out->b = b << 3;
}
/*
====================
R_GetBitsFromMask
====================
*/
void R_GetBitsFromMask(uint Mask, uint *ShiftLeft, uint *ShiftRight)
{
uint Temp, i;
if (Mask == 0)
{
*ShiftLeft = *ShiftRight = 0;
return;
}
Temp = Mask;
for (i = 0; i < 32; i++, Temp >>= 1)
{
if (Temp & 1) break;
}
*ShiftRight = i;
// Temp is preserved, so use it again:
for (i = 0; i < 8; i++, Temp >>= 1)
{
if (!(Temp & 1)) break;
}
*ShiftLeft = 8 - i;
return;
} }

56
render/render.plg Normal file
View File

@ -0,0 +1,56 @@
<html>
<body>
<pre>
<h1>Build Log</h1>
<h3>
--------------------Configuration: render - Win32 Debug--------------------
</h3>
<h3>Command Lines</h3>
Creating temporary file "C:\Temp\RSPD57.tmp" with contents
[
/nologo /MTd /W3 /Gm /Gi /GX /ZI /Od /I "../public" /I "../platform/formats" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR"..\temp\render\!debug/" /Fo"..\temp\render\!debug/" /Fd"..\temp\render\!debug/" /FD /c
"D:\XASH3D\src_main\!source\render\r_texture.c"
]
Creating command line "cl.exe @C:\Temp\RSPD57.tmp"
Creating temporary file "C:\Temp\RSPD58.tmp" with contents
[
kernel32.lib user32.lib gdi32.lib /nologo /subsystem:windows /dll /incremental:yes /pdb:"..\temp\render\!debug/render.pdb" /debug /machine:I386 /nodefaultlib:"libc.lib" /out:"..\temp\render\!debug/render.dll" /implib:"..\temp\render\!debug/render.lib" /pdbtype:sept /libpath:"../public/libs/"
"\XASH3D\src_main\!source\temp\render\!debug\gl_draw.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_light.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_mesh.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_model.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_rmain.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_rmisc.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_rsurf.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_warp.obj"
"\XASH3D\src_main\!source\temp\render\!debug\gl_widnt.obj"
"\XASH3D\src_main\!source\temp\render\!debug\glw_imp.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_backend.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_bloom.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_bspmod.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_sprite.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_studio.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_texture.obj"
"\XASH3D\src_main\!source\temp\render\!debug\r_utils.obj"
]
Creating command line "link.exe @C:\Temp\RSPD58.tmp"
Creating temporary file "C:\Temp\RSPD59.bat" with contents
[
@echo off
copy \XASH3D\src_main\!source\temp\render\!debug\render.dll "D:\Xash3D\bin\render.dll"
]
Creating command line "C:\Temp\RSPD59.bat"
Compiling...
r_texture.c
Linking...
<h3>Output Window</h3>
Performing Custom Build Step on \XASH3D\src_main\!source\temp\render\!debug\render.dll
‘ª®¯¨à®¢ ­® ä ©«®¢: 1.
<h3>Results</h3>
render.dll - 0 error(s), 0 warning(s)
</pre>
</body>
</html>