127 lines
3.9 KiB
C
127 lines
3.9 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 "common/singleton.h"
|
||
|
|
||
![]() |
#include "graphics/model/model_triangle.h"
|
||
![]() |
|
||
|
#include <string>
|
||
|
#include <vector>
|
||
|
#include <map>
|
||
|
|
||
![]() |
namespace Gfx
|
||
|
{
|
||
![]() |
|
||
|
class CEngine;
|
||
|
|
||
|
/**
|
||
![]() |
* \class COldModelManager
|
||
![]() |
* \brief Manager for static models
|
||
|
*
|
||
|
* The manager allows for loading models as static objects and adding
|
||
|
* new instances of models to the engine.
|
||
|
*
|
||
|
* The models are loaded from stanard application model directory and
|
||
|
* they are identified by unique file names.
|
||
|
*
|
||
|
* The models are loaded by creating (if it doesn't exist yet)
|
||
|
* a base engine object from the model geometry. This base object
|
||
|
* is then shared among all instances of this model with the instances
|
||
|
* being engine objects linked to the shared base object.
|
||
|
*
|
||
|
* There is also a possibility of creating a copy of model so it has
|
||
|
* its own and unique base engine object. This is especially useful
|
||
|
* for models where the geometry must be altered.
|
||
|
*/
|
||
![]() |
class COldModelManager
|
||
![]() |
{
|
||
|
public:
|
||
![]() |
COldModelManager(CEngine* engine);
|
||
|
~COldModelManager();
|
||
![]() |
|
||
|
//! Loads a model from given file
|
||
![]() |
bool LoadModel(const std::string& fileName, bool mirrored, int team = 0);
|
||
![]() |
|
||
|
//! Adds an instance of model to the given object rank as a reference to base object
|
||
![]() |
bool AddModelReference(const std::string& fileName, bool mirrored, int objRank, int team = 0);
|
||
![]() |
|
||
|
//! Adds an instance of model to the given object rank as a copy (copied base object)
|
||
![]() |
bool AddModelCopy(const std::string& fileName, bool mirrored, int objRank, int team = 0);
|
||
![]() |
|
||
|
//! Returns true if given model is loaded
|
||
![]() |
bool IsModelLoaded(const std::string& fileName, bool mirrored, int team = 0);
|
||
![]() |
|
||
|
//! Returns the rank of base engine object of given loaded model
|
||
![]() |
int GetModelBaseObjRank(const std::string& fileName, bool mirrored, int team = 0);
|
||
![]() |
|
||
![]() |
//! Deletes all copied objects
|
||
|
void DeleteAllModelCopies();
|
||
|
|
||
![]() |
//! Unloads the given model
|
||
![]() |
void UnloadModel(const std::string& fileName, bool mirrored, int variant = 0);
|
||
![]() |
//! Unloads all models
|
||
|
void UnloadAllModels();
|
||
|
|
||
|
protected:
|
||
|
//! Mirrors the model along the Z axis
|
||
|
void Mirror(std::vector<ModelTriangle>& triangles);
|
||
|
|
||
|
private:
|
||
|
struct ModelInfo
|
||
|
{
|
||
|
std::vector<ModelTriangle> triangles;
|
||
![]() |
int baseObjRank = -1;
|
||
![]() |
};
|
||
|
struct FileInfo
|
||
|
{
|
||
|
std::string fileName;
|
||
|
bool mirrored;
|
||
![]() |
int variant;
|
||
![]() |
|
||
![]() |
inline FileInfo(const std::string& _fileName, bool _mirrored, int _variant = 0)
|
||
![]() |
: fileName(_fileName)
|
||
|
, mirrored(_mirrored)
|
||
![]() |
, variant(_variant)
|
||
![]() |
{}
|
||
![]() |
|
||
|
inline bool operator<(const FileInfo& other) const
|
||
|
{
|
||
|
int compare = fileName.compare(other.fileName);
|
||
|
if (compare < 0)
|
||
|
return true;
|
||
|
if (compare > 0)
|
||
|
return false;
|
||
|
|
||
![]() |
if (variant < other.variant)
|
||
|
return true;
|
||
![]() |
if (variant > other.variant)
|
||
|
return false;
|
||
![]() |
|
||
![]() |
return !mirrored && mirrored != other.mirrored;
|
||
|
}
|
||
|
};
|
||
|
std::map<FileInfo, ModelInfo> m_models;
|
||
![]() |
std::vector<int> m_copiesBaseRanks;
|
||
![]() |
CEngine* m_engine;
|
||
|
};
|
||
|
|
||
|
} // namespace Gfx
|