18 #include "precompiled.h"
35 boost::hash_combine(hash, v.
X);
36 boost::hash_combine(hash, v.
Y);
37 boost::hash_combine(hash, v.
Z);
38 boost::hash_combine(hash, v.
W);
54 return a.items == b.items;
59 return a.items == b.items;
62 template<
typename value_t>
71 return a.first < b.first;
75 template<
typename value_t>
82 return !(b.first < a.first);
86 template<
typename value_t>
91 typename InternedItems_t::iterator it = s_InternedItems.find(items);
92 if (it != s_InternedItems.end())
93 return it->second.get();
98 ENSURE(std::adjacent_find(items.
items.begin(), items.
items.end(), std::binary_negate<Cmp>(Cmp())) == items.
items.end());
100 shared_ptr<SItems> ptr(
new SItems(items));
101 s_InternedItems.insert(std::make_pair(items, ptr));
105 template<
typename value_t>
111 template<
typename value_t>
116 template<
typename value_t>
124 template<
typename value_t>
129 typename SItems::Item addedItem = std::make_pair(name, value);
132 for (
typename std::vector<typename SItems::Item>::iterator it = items.
items.begin(); ; ++it)
134 if (it == items.
items.end() || addedItem.first < it->first)
136 items.
items.insert(it, addedItem);
139 else if (addedItem.first == it->first)
141 it->second = addedItem.second;
147 m_Items = GetInterned(items);
150 template<
typename value_t>
159 m_Items->items.begin(), m_Items->items.end(),
160 std::inserter(items.
items, items.
items.begin()),
163 m_Items = GetInterned(items);
166 template<
typename value_t>
169 std::map<CStrIntern, value_t> ret;
170 for (
size_t i = 0; i < m_Items->items.size(); ++i)
171 ret[m_Items->items[i].first] = m_Items->items[i].second;
175 template<
typename value_t>
178 return m_Items->hash;
181 template<
typename value_t>
185 for (
size_t i = 0; i <
items.size(); ++i)
187 boost::hash_combine(h,
items[i].first);
188 boost::hash_combine(h,
items[i].second);
207 std::stringstream str(
m_Items->
items[i].second.c_str());
236 const std::vector<SItems::Item>& items =
m_Items->
items;
237 for (
size_t i = 0; i < items.size(); ++i)
243 shader->Uniform(binding, v.
X, v.
Y, v.
Z, v.
W);
250 if (name == CStr(
"sim_time"))
254 else if (name == CStr(
"water_tex"))
258 else if (name == CStr(
"sky_cube"))
272 m_Defines.push_back(cd);
std::pair< CStrIntern, value_t > Item
void Add(CStrIntern name, CStrIntern value)
Add a name and associated value to the map of defines.
size_t hash_value(const CStrIntern &v)
bool operator==(const FCDJointWeightPair &a, const FCDJointWeightPair &b)
CShaderParams< value_t >::SItems::Item Item
std::map< CStrIntern, value_t > GetMap() const
Return a copy of the current name/value mapping.
std::vector< float > m_CondArgs
u32 GetHash() const
Returns cached FNV1-A hash of the string.
#define ENSURE(expr)
ensure the expression <expr> evaluates to non-zero.
bool operator()(const Item &a, const Item &b) const
boost::unordered_map< SItems, shared_ptr< SItems > > InternedItems_t
CShaderParams()
Create an empty map of defines.
static CShaderParams CreateEmpty()
bool operator()(const Item &a, const Item &b) const
void Add(const char *name)
size_t GetHash() const
Return a hash of the current mapping.
Represents a mapping of name strings to value, for use with CShaderDefines (values are strings) and C...
void SetMany(const CShaderParams ¶ms)
Add all the names and values from another set of parameters.
int GetInt(const char *name) const
Return the value for the given name as an integer, or 0 if not defined.
static SItems * GetInterned(const SItems &items)
Returns a pointer to an SItems equal to items.
CShaderParams< value_t >::SItems::Item Item
Represents a uniform attribute or texture binding.
Item second_argument_type
bool IsMainThread()
Returns whether the current thread is the 'main' thread (i.e.
std::vector< Item > items
void Set(CStrIntern name, const value_t &value)
Add a name and associated value to the map of parameters.
shared_ptr< CShaderProgram > CShaderProgramPtr
void Add(const char *defname, const char *defvalue, int type, std::vector< float > &args)
bool Active()
Returns whether this uniform attribute is active in the shader.