1
0
forked from 0ad/0ad
0ad/source/graphics/ObjectEntry.h
wraitii a97f7f3917 Hotloading fix after 76acc4e146
Emplace does not replace existing element, insert_or_assign does.

While at it:
 - Clean up the 'outdated' logic and reuse it for actors
 - When an actor fails to load, return a placeholder. This improves
hotloading of broken actors, and makes Cunit behaviour more predictable.
 - Some minor cleanup

Reported by: Stan
Fixes #6157

Differential Revision: https://code.wildfiregames.com/D3882
This was SVN commit r25308.
2021-04-24 09:39:33 +00:00

94 lines
2.9 KiB
C++

/* Copyright (C) 2021 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. 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 2 of the License, or
* (at your option) any later version.
*
* 0 A.D. 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 0 A.D. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef INCLUDED_OBJECTENTRY
#define INCLUDED_OBJECTENTRY
class CModelAbstract;
class CSkeletonAnim;
class CObjectBase;
class CObjectManager;
class CSimulation2;
struct SPropPoint;
#include <map>
#include <set>
#include <vector>
#include "graphics/Color.h"
#include "lib/file/vfs/vfs_path.h"
#include "ps/CStr.h"
#include "graphics/ObjectBase.h"
class CObjectEntry
{
NONCOPYABLE(CObjectEntry);
public:
CObjectEntry(const std::shared_ptr<CObjectBase>& base, CSimulation2& simulation);
~CObjectEntry();
// Construct this actor, using the specified variation selections
bool BuildVariation(const std::vector<const std::set<CStr>*>& completeSelections,
const std::vector<u8>& variationKey, CObjectManager& objectManager);
// Base actor. Contains all the things that don't change between
// different variations of the actor.
std::shared_ptr<CObjectBase> m_Base;
// samplers list
std::vector<CObjectBase::Samp> m_Samplers;
// model name
VfsPath m_ModelName;
// color (used when doing alpha-channel coloring, but not doing player-color)
CColor m_Color;
// (probable TODO: make color a per-model thing, rather than per-objectEntry,
// so we can have lots of color variations without wasting memory on
// lots of objectEntries)
std::wstring m_ProjectileModelName;
/**
* Returns a randomly-chosen animation matching the given ID, or animationName if ID is empty.
* The chosen animation is picked randomly from the GetAnimations list
* with the frequencies as weights (if there are any defined).
* This method should always return an animation
*/
CSkeletonAnim* GetRandomAnimation(const CStr& animationName, const CStr& ID = "") const;
/**
* Returns all the animations matching the given ID or animationName if ID is empty.
* If none found returns Idle animations (which are always added)
*/
std::vector<CSkeletonAnim*> GetAnimations(const CStr& animationName, const CStr& ID = "") const;
// corresponding model
CModelAbstract* m_Model;
private:
CSimulation2& m_Simulation;
typedef std::multimap<CStr, CSkeletonAnim*> SkeletonAnimMap;
SkeletonAnimMap m_Animations;
// TODO: something more memory-efficient than storing loads of similar strings for each unit?
};
#endif