// Filename: shaderPool.I
// Created by:  aignacio (Mar06)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) 2001 - 2004, Disney Enterprises, Inc.  All rights reserved
//
// All use of this software is subject to the terms of the Panda 3d
// Software license.  You should have received a copy of this license
// along with this source code; you will also find a current copy of
// the license at http://etc.cmu.edu/panda3d/docs/license/ .
//
// To contact the maintainers of this program write to
// panda3d-general@lists.sourceforge.net .
//
////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::has_shader
//       Access: Public, Static
//  Description: Returns true if the shader has ever been loaded,
//               false otherwise.
////////////////////////////////////////////////////////////////////
INLINE bool ShaderPool::
has_shader(const string &filename) {
  return get_ptr()->ns_has_shader(filename);
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::verify_shader
//       Access: Public, Static
//  Description: Loads the given filename up into a shader, if it has
//               not already been loaded, and returns true to indicate
//               success, or false to indicate failure.  If this
//               returns true, it is guaranteed that a subsequent call
//               to load_shader() with the same shader name will
//               return a valid Shader pointer.
////////////////////////////////////////////////////////////////////
INLINE bool ShaderPool::
verify_shader(const string &filename) {
  return load_shader(filename) != (Shader *)NULL;
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::load_shader
//       Access: Public, Static
//  Description: Loads the given filename up into a shader, if it has
//               not already been loaded, and returns the new shader.
//               If a shader with the same filename was previously
//               loaded, returns that one instead.  If the shader
//               file cannot be found, returns NULL.
////////////////////////////////////////////////////////////////////
INLINE CPT(Shader) ShaderPool::
load_shader(const string &filename) {
  return get_ptr()->ns_load_shader(filename);
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::add_shader
//       Access: Public, Static
//  Description: Adds the indicated already-loaded shader to the
//               pool.  The shader will always replace any
//               previously-loaded shader in the pool that had the
//               same filename.
////////////////////////////////////////////////////////////////////
INLINE void ShaderPool::
add_shader(const string &filename, Shader *shader) {
  get_ptr()->ns_add_shader(filename, shader);
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::release_shader
//       Access: Public, Static
//  Description: Removes the indicated shader from the pool,
//               indicating it will never be loaded again; the shader
//               may then be freed.  If this function is never called,
//               a reference count will be maintained on every shader
//               every loaded, and shaders will never be freed.
////////////////////////////////////////////////////////////////////
INLINE void ShaderPool::
release_shader(const string &filename) {
  get_ptr()->ns_release_shader(filename);
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::release_all_shaders
//       Access: Public, Static
//  Description: Releases all shaders in the pool and restores the
//               pool to the empty state.
////////////////////////////////////////////////////////////////////
INLINE void ShaderPool::
release_all_shaders() {
  get_ptr()->ns_release_all_shaders();
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::garbage_collect
//       Access: Public, Static
//  Description: Releases only those shaders in the pool that have a
//               reference count of exactly 1; i.e. only those
//               shaders that are not being used outside of the pool.
//               Returns the number of shaders released.
////////////////////////////////////////////////////////////////////
INLINE int ShaderPool::
garbage_collect() {
  return get_ptr()->ns_garbage_collect();
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::list_contents
//       Access: Public, Static
//  Description: Lists the contents of the shader pool to the
//               indicated output stream.
////////////////////////////////////////////////////////////////////
INLINE void ShaderPool::
list_contents(ostream &out) {
  get_ptr()->ns_list_contents(out);
}

////////////////////////////////////////////////////////////////////
//     Function: ShaderPool::Constructor
//       Access: Private
//  Description: The constructor is not intended to be called
//               directly; there's only supposed to be one ShaderPool
//               in the universe and it constructs itself.
////////////////////////////////////////////////////////////////////
INLINE ShaderPool::
ShaderPool() {
}
