celestia/src/celmodel/material.cpp

50 lines
1.4 KiB
C++

// material.cpp
//
// Copyright (C) 2004-2010, Celestia Development Team
// Original version by Chris Laurel <claurel@gmail.com>
//
// 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 2
// of the License, or (at your option) any later version.
#include <tuple>
#include "material.h"
namespace cmod
{
Material::Material()
{
maps.fill(InvalidResource);
}
bool
operator<(const Color& c0, const Color& c1)
{
return std::tie(c0.m_red, c0.m_green, c0.m_blue)
< std::tie(c1.m_red, c1.m_green, c1.m_blue);
}
bool
operator<(const Material& m0, const Material& m1)
{
// Checking opacity first and doing it backwards is deliberate. It means
// that after sorting, translucent materials will end up with higher
// material indices than opaque ones. Ultimately, after sorting
// mesh primitive groups by material, translucent groups will end up
// rendered after opaque ones.
// Reverse sense of comparison for blending--additive blending is 1, normal
// blending is 0, and we'd prefer to render additively blended submeshes
// last.
return std::tie(m0.opacity, m1.blend, m0.diffuse, m0.emissive, m0.specular, m0.specularPower, m0.maps)
< std::tie(m1.opacity, m0.blend, m1.diffuse, m1.emissive, m1.specular, m1.specularPower, m1.maps);
}
}