2014-10-14 13:11:37 +00:00
|
|
|
|
/*
|
|
|
|
|
* This file is part of the Colobot: Gold Edition source code
|
|
|
|
|
* Copyright (C) 2001-2014, Daniel Roux, EPSITEC SA & TerranovaTeam
|
|
|
|
|
* http://epsiteс.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
|
|
|
|
|
*/
|
2012-07-11 18:50:42 +00:00
|
|
|
|
|
2012-08-11 16:39:16 +00:00
|
|
|
|
/**
|
|
|
|
|
* \file graphics/engine/modelfile.h
|
2012-09-19 21:50:28 +00:00
|
|
|
|
* \brief Model loading - CModelFile class (aka modfile)
|
2012-08-11 16:39:16 +00:00
|
|
|
|
*/
|
2012-07-11 18:50:42 +00:00
|
|
|
|
|
2012-09-19 21:50:28 +00:00
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
2012-07-26 20:26:19 +00:00
|
|
|
|
#include "graphics/core/vertex.h"
|
|
|
|
|
#include "graphics/core/material.h"
|
2012-09-19 21:50:28 +00:00
|
|
|
|
|
2012-07-11 18:50:42 +00:00
|
|
|
|
#include "math/vector.h"
|
|
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
#include <vector>
|
|
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-09-19 21:50:28 +00:00
|
|
|
|
// Graphics module namespace
|
2012-07-11 18:50:42 +00:00
|
|
|
|
namespace Gfx {
|
|
|
|
|
|
2012-08-31 18:55:16 +00:00
|
|
|
|
|
2012-07-11 18:50:42 +00:00
|
|
|
|
/**
|
2013-01-27 10:43:53 +00:00
|
|
|
|
* \enum LODLevel
|
|
|
|
|
* \brief Level-of-detail
|
|
|
|
|
*
|
|
|
|
|
* A quantified replacement for older values of min/max.
|
|
|
|
|
*/
|
|
|
|
|
enum LODLevel
|
|
|
|
|
{
|
|
|
|
|
LOD_Constant = -1, //!< triangle is always visible, no matter at what distance
|
|
|
|
|
LOD_Low = 1, //!< triangle is visible at farthest distance (lowest quality)
|
|
|
|
|
LOD_Medium = 2, //!< triangle is visible at medium distance (medium quality)
|
|
|
|
|
LOD_High = 4 //!< triangle is visible at closest distance (highest quality)
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* \struct ModelTriangle
|
|
|
|
|
* \brief Triangle of a 3D model
|
|
|
|
|
*/
|
2012-07-11 18:50:42 +00:00
|
|
|
|
struct ModelTriangle
|
|
|
|
|
{
|
|
|
|
|
//! 1st vertex
|
2012-09-19 21:50:28 +00:00
|
|
|
|
VertexTex2 p1;
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! 2nd vertex
|
2012-09-19 21:50:28 +00:00
|
|
|
|
VertexTex2 p2;
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! 3rd vertex
|
2012-09-19 21:50:28 +00:00
|
|
|
|
VertexTex2 p3;
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! Material
|
2012-09-19 21:50:28 +00:00
|
|
|
|
Material material;
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! Name of 1st texture
|
|
|
|
|
std::string tex1Name;
|
|
|
|
|
//! Name of 2nd texture
|
|
|
|
|
std::string tex2Name;
|
2012-08-31 18:55:16 +00:00
|
|
|
|
//! If true, 2nd texture will be taken from current engine setting
|
|
|
|
|
bool variableTex2;
|
2013-01-27 10:43:53 +00:00
|
|
|
|
//! LOD level
|
|
|
|
|
LODLevel lodLevel;
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! Rendering state to be set
|
2012-08-31 18:55:16 +00:00
|
|
|
|
int state;
|
|
|
|
|
|
|
|
|
|
ModelTriangle()
|
|
|
|
|
{
|
|
|
|
|
variableTex2 = true;
|
2013-01-27 10:43:53 +00:00
|
|
|
|
lodLevel = LOD_Constant;
|
2012-08-31 18:55:16 +00:00
|
|
|
|
state = 0;
|
|
|
|
|
}
|
2012-07-11 18:50:42 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
2012-12-26 19:58:02 +00:00
|
|
|
|
* \class CModelFile
|
|
|
|
|
* \brief Model file reader/writer
|
|
|
|
|
*
|
|
|
|
|
* Allows reading and writing model objects. Models are collections of ModelTriangle structs.
|
|
|
|
|
*/
|
2012-07-11 18:50:42 +00:00
|
|
|
|
class CModelFile
|
|
|
|
|
{
|
|
|
|
|
public:
|
2012-12-26 19:58:02 +00:00
|
|
|
|
CModelFile();
|
2012-07-11 18:50:42 +00:00
|
|
|
|
~CModelFile();
|
|
|
|
|
|
2012-08-31 18:55:16 +00:00
|
|
|
|
//! Reads a model in text format from file
|
|
|
|
|
bool ReadTextModel(const std::string &fileName);
|
|
|
|
|
//! Reads a model in text format from stream
|
|
|
|
|
bool ReadTextModel(std::istream &stream);
|
|
|
|
|
|
|
|
|
|
//! Writes the model in text format to a file
|
|
|
|
|
bool WriteTextModel(const std::string &fileName);
|
|
|
|
|
//! Writes the model in text format to a stream
|
|
|
|
|
bool WriteTextModel(std::ostream &stream);
|
|
|
|
|
|
|
|
|
|
//! Reads a model in new binary format from file
|
|
|
|
|
bool ReadBinaryModel(const std::string &fileName);
|
|
|
|
|
//! Reads a model in new binary format from stream
|
|
|
|
|
bool ReadBinaryModel(std::istream &stream);
|
|
|
|
|
|
|
|
|
|
//! Writes the model in binary format to a file
|
|
|
|
|
bool WriteBinaryModel(const std::string &fileName);
|
|
|
|
|
//! Writes the model in binary format to a stream
|
|
|
|
|
bool WriteBinaryModel(std::ostream &stream);
|
2012-07-11 18:50:42 +00:00
|
|
|
|
|
|
|
|
|
//! Reads a binary Colobot model from file
|
2012-08-31 18:55:16 +00:00
|
|
|
|
//! @deprecated
|
|
|
|
|
bool ReadModel(const std::string &fileName);
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! Reads a binary Colobot model from stream
|
2012-08-31 18:55:16 +00:00
|
|
|
|
//! @deprecated
|
|
|
|
|
bool ReadModel(std::istream &stream);
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! Writes the model to Colobot binary model file
|
2012-08-31 18:55:16 +00:00
|
|
|
|
//! @deprecated
|
|
|
|
|
bool WriteModel(const std::string &fileName);
|
2012-07-11 18:50:42 +00:00
|
|
|
|
//! Writes the model to Colobot binary model file
|
2012-08-31 18:55:16 +00:00
|
|
|
|
//! @deprecated
|
2012-07-11 18:50:42 +00:00
|
|
|
|
bool WriteModel(std::ostream &stream);
|
|
|
|
|
|
|
|
|
|
//! Returns the number of triangles in model
|
|
|
|
|
int GetTriangleCount();
|
2012-08-31 18:55:16 +00:00
|
|
|
|
|
2012-07-15 17:17:49 +00:00
|
|
|
|
//! Returns the triangle vector
|
2012-09-19 21:50:28 +00:00
|
|
|
|
const std::vector<ModelTriangle>& GetTriangles();
|
2012-08-31 18:55:16 +00:00
|
|
|
|
|
2013-06-16 19:39:21 +00:00
|
|
|
|
//! Controls printing of debug information
|
|
|
|
|
void SetPrintDebugInfo(bool printDebugInfo);
|
|
|
|
|
|
2012-07-11 18:50:42 +00:00
|
|
|
|
protected:
|
2013-01-27 10:43:53 +00:00
|
|
|
|
//@{
|
|
|
|
|
//! @deprecated min, max conversions
|
|
|
|
|
LODLevel MinMaxToLodLevel(float min, float max);
|
|
|
|
|
void LODLevelToMinMax(LODLevel lodLevel, float& min, float& max);
|
|
|
|
|
//@}
|
2012-07-11 18:50:42 +00:00
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
//! Model triangles
|
2012-09-19 21:50:28 +00:00
|
|
|
|
std::vector<ModelTriangle> m_triangles;
|
2013-06-16 19:39:21 +00:00
|
|
|
|
bool m_printDebugInfo;
|
2012-07-11 18:50:42 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
}; // namespace Gfx
|
2013-05-26 15:47:54 +00:00
|
|
|
|
|