109 lines
3.1 KiB
C++
109 lines
3.1 KiB
C++
/* -----------------------------------------------------------------------------
|
|
GSFramework
|
|
Copyright 2001-2013 Emmanuel Julien. All Rights Reserved.
|
|
----------------------------------------------------------------------------- */
|
|
|
|
|
|
#include "gpu/gpu_geometry.h"
|
|
#include "gpu/gpu_renderer.h"
|
|
#include "core/geometry.h"
|
|
#include "core/geometry_to_triangle_list.h"
|
|
#include "core/triangle_list.h"
|
|
#include "log/log.h"
|
|
|
|
using namespace GS::GPU;
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool Geometry::AllocateVBO(uint count)
|
|
{
|
|
if (!vbo.Allocate(count))
|
|
return false;
|
|
|
|
for (uint n = 0; n < count; ++n)
|
|
vbo[n] = renderer.NewVBO();
|
|
|
|
return true;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool Geometry::SetMaterial(uint index, GS::Render::Material *m)
|
|
{
|
|
if (index >= material_table.GetCount())
|
|
return false;
|
|
|
|
// Update all display lists using this material index.
|
|
for (uint n = 0; n < display_list.GetCount(); ++n)
|
|
if (DisplayList *dlist = display_list[n])
|
|
if (dlist->material == material_table[index])
|
|
dlist->material = (GPU::Material *)m;
|
|
|
|
// Update the material table.
|
|
material_table[index] = m;
|
|
|
|
return true;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool Geometry::ShouldReloadOnDependencyChange(const char *n) const
|
|
{
|
|
for (uint i = 0; i < material_table.GetCount(); ++i)
|
|
if (material_table[i] && (material_table[i]->name == n))
|
|
return true;
|
|
|
|
return name == n;
|
|
}
|
|
//------------------------------------------------------------------------------
|
|
|
|
//------------------------------------------------------------------------------
|
|
bool Geometry::Create(GS::Render::ResourceFactory &rf, const GS::Core::Geometry &g)
|
|
{
|
|
__LOG_H__ << "Setup geometry '" << g.name << "'.\n";
|
|
name = g.name;
|
|
|
|
using namespace Core;
|
|
|
|
// Setup materials.
|
|
if (material_table.Allocate(g.material_table.GetCount()))
|
|
for (uint n = 0; n < g.material_table.GetCount(); ++n)
|
|
material_table[n] = rf.LoadMaterial(g.material_table[n].name, !g.material_table[n].use_cache);
|
|
|
|
// Build geometry triangle list.
|
|
AutoList <Trilist *> tlist;
|
|
if (!GeometryToTriangleList::Convert(g, tlist))
|
|
return false;
|
|
|
|
// Setup geometry display lists.
|
|
if (display_list.Allocate(tlist.GetCount()))
|
|
{
|
|
uint n = 0;
|
|
ListForeachPtr(Trilist *, t, tlist)
|
|
{
|
|
display_list[n] = renderer.NewDisplayList();
|
|
display_list[n]->Create(t, material_table[t->mat]);
|
|
++n;
|
|
}
|
|
}
|
|
flag = g.flag;
|
|
|
|
// Skinning.
|
|
bone_bind_matrix.Clone(g.bone_bind_matrix);
|
|
g.ComputeBoneBoundingVolumes(bone_minmax);
|
|
|
|
// Load proxies.
|
|
if (!g.lod_proxy.IsEmpty())
|
|
lod_proxy = rf.LoadGeometry(g.lod_proxy);
|
|
lod_distance = g.lod_distance;
|
|
|
|
if (!g.shadow_proxy.IsEmpty())
|
|
shadow_proxy = rf.LoadGeometry(g.shadow_proxy);
|
|
|
|
minmax = g.ComputeMinMax();
|
|
// hotspot.Set(0, 0, 0);
|
|
hotspot = (minmax.mn + minmax.mx) * 0.5f;
|
|
|
|
return true;
|
|
}
|
|
//------------------------------------------------------------------------------
|