184 lines
No EOL
6.8 KiB
C++
184 lines
No EOL
6.8 KiB
C++
/*
|
|
** Command & Conquer Renegade(tm)
|
|
** Copyright 2025 Electronic Arts Inc.
|
|
**
|
|
** 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
*/
|
|
|
|
/***********************************************************************************************
|
|
*** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
|
|
***********************************************************************************************
|
|
* *
|
|
* Project Name : WW3D *
|
|
* *
|
|
* $Archive:: /Commando/Code/ww3d2/ww3dformat.h $*
|
|
* *
|
|
* Original Author:: Nathaniel Hoffman *
|
|
* *
|
|
* $Author:: Jani_p $*
|
|
* *
|
|
* $Modtime:: 10/06/01 11:30p $*
|
|
* *
|
|
* $Revision:: 11 $*
|
|
* *
|
|
*---------------------------------------------------------------------------------------------*
|
|
* Functions: *
|
|
* Vector4_to_Color - converts a vector4 to the format in format *
|
|
* Color_to_Vector4 - converts a color in the format described in format to a Vector4 *
|
|
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
|
|
|
|
#if defined(_MSC_VER)
|
|
#pragma once
|
|
#endif
|
|
|
|
#ifndef WW3DFORMAT_H
|
|
#define WW3DFORMAT_H
|
|
|
|
#include "always.h"
|
|
#include "wwstring.h"
|
|
|
|
class Vector4;
|
|
class Targa;
|
|
|
|
/*
|
|
** Enum for possible surface formats. This is a small subset of the D3DFORMAT
|
|
** enum which lists the formats supported by DX8; we will add new members to
|
|
** this list as needed (keeping it in the same order as D3DFORMAT).
|
|
** NOTE: Whenever this is changed, formconv.h/.cpp must be modified as well
|
|
** (that contains the code for converting between this and D3DFORMAT)..
|
|
**
|
|
** The format names use the D3DFORMAT conventions:
|
|
** A = Alpha
|
|
** R = Red
|
|
** G = Green
|
|
** B = Blue
|
|
** X = Unused Bits
|
|
** P = Palette
|
|
** L = Luminance
|
|
**
|
|
** Further, the order of the pieces are from MSB first; hence
|
|
** WW3D_FORMAT_A8L8 indicates that the high byte of this two byte
|
|
** format is alpha.
|
|
*/
|
|
enum WW3DFormat {
|
|
WW3D_FORMAT_UNKNOWN=0,
|
|
WW3D_FORMAT_R8G8B8,
|
|
WW3D_FORMAT_A8R8G8B8,
|
|
WW3D_FORMAT_X8R8G8B8,
|
|
WW3D_FORMAT_R5G6B5,
|
|
WW3D_FORMAT_X1R5G5B5,
|
|
WW3D_FORMAT_A1R5G5B5,
|
|
WW3D_FORMAT_A4R4G4B4,
|
|
WW3D_FORMAT_R3G3B2,
|
|
WW3D_FORMAT_A8,
|
|
WW3D_FORMAT_A8R3G3B2,
|
|
WW3D_FORMAT_X4R4G4B4,
|
|
WW3D_FORMAT_A8P8,
|
|
WW3D_FORMAT_P8,
|
|
WW3D_FORMAT_L8,
|
|
WW3D_FORMAT_A8L8,
|
|
WW3D_FORMAT_A4L4,
|
|
WW3D_FORMAT_U8V8, // Bumpmap
|
|
WW3D_FORMAT_L6V5U5, // Bumpmap
|
|
WW3D_FORMAT_X8L8V8U8, // Bumpmap
|
|
WW3D_FORMAT_DXT1,
|
|
WW3D_FORMAT_DXT2,
|
|
WW3D_FORMAT_DXT3,
|
|
WW3D_FORMAT_DXT4,
|
|
WW3D_FORMAT_DXT5,
|
|
WW3D_FORMAT_COUNT // Used only to determine number of surface formats
|
|
};
|
|
|
|
// Utility function - not much used otherwise it would use an array.
|
|
// NOTE: when adding values to WW3DFormat add here also (if they have alpha).
|
|
inline bool Has_Alpha(WW3DFormat format) {
|
|
switch (format) {
|
|
case WW3D_FORMAT_A8R8G8B8:
|
|
case WW3D_FORMAT_A1R5G5B5:
|
|
case WW3D_FORMAT_A4R4G4B4:
|
|
case WW3D_FORMAT_A8:
|
|
case WW3D_FORMAT_A8R3G3B2:
|
|
case WW3D_FORMAT_A8P8:
|
|
case WW3D_FORMAT_A8L8:
|
|
case WW3D_FORMAT_A4L4:
|
|
case WW3D_FORMAT_DXT2:
|
|
case WW3D_FORMAT_DXT3:
|
|
case WW3D_FORMAT_DXT4:
|
|
case WW3D_FORMAT_DXT5:
|
|
return true;
|
|
break;
|
|
default:
|
|
return false;
|
|
break;
|
|
};
|
|
}
|
|
|
|
inline int Alpha_Bits(WW3DFormat format) {
|
|
switch (format) {
|
|
case WW3D_FORMAT_A8R8G8B8:
|
|
case WW3D_FORMAT_A8:
|
|
case WW3D_FORMAT_A8R3G3B2:
|
|
case WW3D_FORMAT_A8P8:
|
|
case WW3D_FORMAT_A8L8:
|
|
return 8;
|
|
break;
|
|
case WW3D_FORMAT_A4R4G4B4:
|
|
case WW3D_FORMAT_A4L4:
|
|
case WW3D_FORMAT_DXT3:
|
|
case WW3D_FORMAT_DXT4:
|
|
case WW3D_FORMAT_DXT5:
|
|
return 4;
|
|
break;
|
|
case WW3D_FORMAT_A1R5G5B5:
|
|
case WW3D_FORMAT_DXT2:
|
|
return 1;
|
|
break;
|
|
default:
|
|
return 0;
|
|
break;
|
|
};
|
|
}
|
|
|
|
// Color convertion routines
|
|
|
|
// The color will be returned as an unsigned int always
|
|
// any unused bits will be garbage
|
|
void Vector4_to_Color(unsigned int *outc,const Vector4 &inc,const WW3DFormat format);
|
|
|
|
// If the format does not support alpha
|
|
// the alpha will be garbage
|
|
void Color_to_Vector4(Vector4* outc,const unsigned int inc,const WW3DFormat format);
|
|
|
|
// Define matching WW3D format based from Targa header.
|
|
//
|
|
// dest_format - WW3DFormat that can be used as a destination (D3D surface) on current hardware
|
|
// src_format - WW3DFormat that represents the format the bitmap is stored in the targa file.
|
|
// src_bpp - bytes per pixel in the source surface
|
|
// targa - reference to the targa object...
|
|
void Get_WW3D_Format(WW3DFormat& dest_format,WW3DFormat& src_format,unsigned& src_bpp,const Targa& targa);
|
|
|
|
// The same as above, but doesn't validate the device - only checks the source format.
|
|
void Get_WW3D_Format(WW3DFormat& src_format,unsigned& src_bpp,const Targa& targa);
|
|
|
|
// Get valid texture format (on current hardware) that is closest to the given format (for instance, 32 bit ARGB8888 would
|
|
// return 16 bit ARGB4444 if the device doesn't support 32 bit textures).
|
|
// Pass false to the second parameter if you don't wish to consider compressed textures on hardware that supports them.
|
|
// The parameter has no effect on hardware that doesn't support compression.
|
|
WW3DFormat Get_Valid_Texture_Format(WW3DFormat format,bool is_compression_allowed);
|
|
|
|
unsigned Get_Bytes_Per_Pixel(WW3DFormat format);
|
|
|
|
void Get_WW3D_Format_Name(WW3DFormat format, StringClass& name);
|
|
|
|
#endif |