colobot/colobot-base/graphics/model/model_io_structs.h

257 lines
6.0 KiB
C++

/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2023, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
*
* 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://gnu.org/licenses
*/
#pragma once
#include "graphics/model/model_triangle.h"
namespace Gfx
{
/*******************************************************
Deprecated enums/magic values
*******************************************************/
/**
* \enum ModelLODLevel
* \brief Old level-of-detail enum
*
* @deprecated
*/
enum class ModelLODLevel
{
Constant = -1, //!< triangle is always visible, no matter at what distance
Low = 1, //!< triangle is visible at farthest distance (lowest quality)
Medium = 2, //!< triangle is visible at medium distance (medium quality)
High = 4 //!< triangle is visible at closest distance (highest quality)
};
/**
* \enum ModelRenderState
* \brief Old render state enum (values copied from EngineRenderState)
*
* @deprecated
*/
enum class ModelRenderState
{
Part1 = 256, //!< old ENG_RSTATE_PART1
Part2 = 512, //!< old ENG_RSTATE_PART2
Part3 = 1024, //!< old ENG_RSTATE_PART3
TwoFace = 4096, //!< old ENG_RSTATE_2FACE
Alpha = 8192 //!< old ENG_RSTATE_ALPHA
};
//! Legacy material structure
struct LegacyMaterial
{
//! Diffuse color
Color diffuse;
//! Ambient color
Color ambient;
//! Specular color
Color specular;
bool operator==(const LegacyMaterial& mat) const
{
return diffuse == mat.diffuse && ambient == mat.ambient && specular == mat.specular;
}
bool operator!=(const LegacyMaterial& mat) const
{
return !operator==(mat);
}
};
/*******************************************************
New model formats
*******************************************************/
/**
* \struct ModelHeaderV1AndV2
* \brief Header for new model file version 1 and 2
*/
struct ModelHeaderV1AndV2
{
//! File version (1, 2, ...)
int version = 0;
//! Total number of triangles
int totalTriangles = 0;
};
/**
* \struct ModelTriangleV1AndV2
* \brief Triangle of new model file version 1 and 2
*/
struct ModelTriangleV1AndV2
{
//! 1st vertex
Vertex3D p1;
//! 2nd vertex
Vertex3D p2;
//! 3rd vertex
Vertex3D p3;
//! Name of 1st texture
std::string tex1Name;
//! Name of 2nd texture
std::string tex2Name;
//! If true, 2nd texture will be taken from current engine setting
bool variableTex2 = true;
//! LOD level (only version 1)
ModelLODLevel lodLevel = ModelLODLevel::Constant;
//! Rendering state to be set
int state = 0;
};
/**
* \struct ModelHeaderV3
* \brief Header for new model file version 3
*/
struct ModelHeaderV3
{
//! File version (1, 2, ...)
int version = 0;
//! Total number of crash spheres
int totalCrashSpheres = 0;
//! Whether model has shadow spot
bool hasShadowSpot = false;
//! Whether model has camera collision sphere
bool hasCameraCollisionSphere = false;
//! Total number of meshes
int totalMeshes = 0;
};
/**
* \struct ModelMeshHeaderV3
* \brief Header for mesh saved in new model file version 3
*/
struct ModelMeshHeaderV3
{
//! Total number of triangles
int totalTriangles = 0;
//! Mesh name
std::string name;
//! Parent mesh name
std::string parentName;
//! Mesh position
glm::vec3 position = { 0, 0, 0 };
//! Mesh rotation
glm::vec3 rotation = { 0, 0, 0 };
//! Mesh scale
glm::vec3 scale = { 1, 1, 1 };
};
/**
* \struct ModelTriangleV3
* \brief Mesh triangle saved in new model file version 3
*
* NOTE: this is newest version, always same as ModelTriangle struct.
*/
struct ModelTriangleV3 : ModelTriangle {};
/*******************************************************
Deprecated formats
*******************************************************/
/**
* \struct OldModelHeader
* \brief Old Colobot binary model header info
*
* @deprecated
*/
struct OldModelHeader
{
//! Revision number
int revision = 0;
//! Version number
int version = 0;
//! Total number of triangles
int totalTriangles = 0;
//! Reserved area
int reserved[10] = {};
};
/**
* \struct OldModelTriangleV1
* \brief Old Colobot binary model file version 1
*
* @deprecated
*/
struct OldModelTriangleV1
{
char used = 0;
char selected = 0;
Vertex3D p1;
Vertex3D p2;
Vertex3D p3;
char texName[21] = {'\0'};
float min = 0;
float max = 0;
};
/**
* \struct OldModelTriangleV2
* \brief Old Colobot binary model file version 2
*
* @deprecated
*/
struct OldModelTriangleV2
{
char used = 0;
char selected = 0;
Vertex3D p1;
Vertex3D p2;
Vertex3D p3;
char texName[21] = {'\0'};
float min = 0.0f;
float max = 0.0f;
long state = 0;
short reserved1 = 0;
short reserved2 = 0;
short reserved3 = 0;
short reserved4 = 0;
};
/**
* \struct OldModelTriangleV3
* \brief Old Colobot binary model file version 3
*
* @deprecated
*/
struct OldModelTriangleV3
{
char used = 0;
char selected = 0;
Vertex3D p1;
Vertex3D p2;
Vertex3D p3;
char texName[21] = {'\0'};
float min = 0.0f;
float max = 0.0f;
long state = 0;
short texNum2 = 0;
short reserved2 = 0;
short reserved3 = 0;
short reserved4 = 0;
};
} // namespace Gfx