94 lines
2.3 KiB
C++
94 lines
2.3 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "core/material.h"
|
|
#include "log/log.h"
|
|
|
|
using namespace GS::Core;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
Material::TextureStage *Material::GetChannelStage(MaterialChannel channel) const
|
|
{
|
|
for (int n = 0; n < max_texture_stage; ++n)
|
|
if (texstage[n].channel == channel)
|
|
return &texstage[n];
|
|
return NULL;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
Material::TextureStage *Material::NewStage(MaterialChannel channel, const char *uri, UVMode uv_mode, uchar uv_index)
|
|
{
|
|
TextureStage *s = GetChannelStage(channel);
|
|
if (s)
|
|
return s;
|
|
|
|
// Find a free stage.
|
|
for (int n = 0; n < max_texture_stage; ++n)
|
|
if (texstage[n].channel == Channel_None)
|
|
{
|
|
s = &texstage[n];
|
|
break;
|
|
}
|
|
|
|
if (!s)
|
|
__ERR__(__LOG_W__ << "No more free texture stage, cannot create new stage.\n", NULL)
|
|
|
|
// Initialize stage.
|
|
s->channel = channel;
|
|
s->t = uri;
|
|
s->uv_mode = uv_mode;
|
|
s->uv_index = uv_index;
|
|
return s;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Material::Reset()
|
|
{
|
|
renderword = Render_None;
|
|
blendop = Blend_None;
|
|
|
|
diffuse.Set(1, 1, 1);
|
|
specular.Set(1, 1, 1);
|
|
self.Set(0, 0, 0);
|
|
ambient.Set(1, 1, 1);
|
|
|
|
glossiness = 0.4f;
|
|
opacity = 1;
|
|
reflection = 0;
|
|
irefraction = 1;
|
|
athreshold = 0.1f;
|
|
depth_bias = 0;
|
|
|
|
shader.Clear();
|
|
|
|
for (int n = 0; n < max_texture_stage; n++)
|
|
texstage[n].Reset();
|
|
texstage_count = 0;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
void Material::TextureStage::Reset()
|
|
{
|
|
channel = Channel_None;
|
|
op = Operator_Default;
|
|
t.Clear();
|
|
|
|
uv_mode = UV_UV;
|
|
uv_matrix = Matrix4::IdentityMatrix();
|
|
uv_index = 0;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
Material::Material()
|
|
{
|
|
texstage.Allocate(max_texture_stage);
|
|
Reset();
|
|
}
|