ROOT logo
// $Id: ZGlProgram.cxx 2234 2009-09-16 15:35:48Z matevz $

// Copyright (C) 1999-2008, Matevz Tadel. All rights reserved.
// This file is part of GLED, released under GNU General Public License version 2.
// For the licensing terms see $GLEDSYS/LICENSE or http://www.gnu.org/.

#include "ZGlProgram.h"
#include "ZGlProgram.c7"
#include "ZGlShader.h"
#include <Stones/SGlUniform.h>

#include <Glasses/ZQueen.h>

// ZGlProgram

//______________________________________________________________________________
//
// Representation of a GLSL program.
// Children are enforced to be ZGLShader instances.
//
// ZGlProgram_GL_Rnr compiles all the shaders and links the program.
//
// Unifrom variables are extracted and information is stored in the local
// map. Defaults are parsed out of the shader source and stored as string.
//   uniform vec3  BrickColor;  // (1.0, 0.3, 0.2)
// If bSetUniDefaults is set (default), these values are assigned to
// appropriate GL uniform variables when the program is activated.
// See also SGlUniform and SGlUniform_GL_Rnr.
//
//
// TODO:
// 1. GL_Rnr::Draw() does nothing - can only be via state-modifier link.
// 2. Add class for holding alternate uniform variable values.
//    One could have a ZList (or ZNameMap) and use name, title of elements
//    for variable name, value string - but that is burning memory.
//    Better to have glass ZGlUniformValues that holds the lot in a list
//    and marks in the GL_Rnr which are really available.
//    ZGlProgram would have to become ZGlRnrMod for that, to allow for
//    optimized detection of program state via time-stamps.
//    Special Fltk class would have to be written.
//    In any case, the univorm-values could be populated from a succesfully
//    compiled program - all information is already available in mUniMap.
// 3. Why is ZImage not a RnrMod? Should we separate ZTexture and ZImage?
//    This might become relevant for sampler uniform varaibles.

ClassImp(ZGlProgram);

//==============================================================================

void ZGlProgram::_init()
{
  bSetUniDefaults = true;

  bLinked = false;
}

ZGlProgram::ZGlProgram(const Text_t* n, const Text_t* t) :
  ZList(n, t)
{
  _init();
  SetElementFID(ZGlShader::FID());
}

ZGlProgram::~ZGlProgram()
{}

//==============================================================================

void ZGlProgram::swap_unimap(mName2pUniform_t& umap)
{
  GMutexHolder uni_lock(mUniMutex);

  for (mName2pUniform_i i = mUniMap.begin(); i != mUniMap.end(); ++i)
  {
    i->second->DecRefCount();
  }
  mUniMap.swap(umap);
  for (mName2pUniform_i i = mUniMap.begin(); i != mUniMap.end(); ++i)
  {
    i->second->IncRefCount();
  }
}

//==============================================================================

void ZGlProgram::EmitRelinkRay()
{
  if (mQueen && mSaturn->AcceptsRays()) {
    auto_ptr<Ray> ray
      (Ray::PtrCtor(this, PRQN_relink, mTimeStamp, FID()));
    mQueen->EmitRay(ray);
  }
}
void ZGlProgram::EmitRebuildRay()
{
  if (mQueen && mSaturn->AcceptsRays()) {
    auto_ptr<Ray> ray
      (Ray::PtrCtor(this, PRQN_rebuild, mTimeStamp, FID()));
    mQueen->EmitRay(ray);
  }
}

void ZGlProgram::ReloadAndRebuild()
{
  // Running in a detached thread.

  lpZGlass_t shaders;
  CopyList(shaders);
  for (lpZGlass_i s = shaders.begin(); s != shaders.end(); ++s)
  {
    GLensWriteHolder slck(*s);
    static_cast<ZGlShader*>(*s)->Load();
  }
  GLensWriteHolder plck(this);
  EmitRebuildRay();
}

//==============================================================================

void ZGlProgram::PrintLog()
{
  cout << "Link log for " << Identify() << "\n" << mLog;
}

void ZGlProgram::PrintUniforms()
{
  for (mName2pUniform_i i = mUniMap.begin(); i != mUniMap.end(); ++i)
  {
    cout << i->first << "  " << i->second->fDefaults << endl;
  }
}
 ZGlProgram.cxx:1
 ZGlProgram.cxx:2
 ZGlProgram.cxx:3
 ZGlProgram.cxx:4
 ZGlProgram.cxx:5
 ZGlProgram.cxx:6
 ZGlProgram.cxx:7
 ZGlProgram.cxx:8
 ZGlProgram.cxx:9
 ZGlProgram.cxx:10
 ZGlProgram.cxx:11
 ZGlProgram.cxx:12
 ZGlProgram.cxx:13
 ZGlProgram.cxx:14
 ZGlProgram.cxx:15
 ZGlProgram.cxx:16
 ZGlProgram.cxx:17
 ZGlProgram.cxx:18
 ZGlProgram.cxx:19
 ZGlProgram.cxx:20
 ZGlProgram.cxx:21
 ZGlProgram.cxx:22
 ZGlProgram.cxx:23
 ZGlProgram.cxx:24
 ZGlProgram.cxx:25
 ZGlProgram.cxx:26
 ZGlProgram.cxx:27
 ZGlProgram.cxx:28
 ZGlProgram.cxx:29
 ZGlProgram.cxx:30
 ZGlProgram.cxx:31
 ZGlProgram.cxx:32
 ZGlProgram.cxx:33
 ZGlProgram.cxx:34
 ZGlProgram.cxx:35
 ZGlProgram.cxx:36
 ZGlProgram.cxx:37
 ZGlProgram.cxx:38
 ZGlProgram.cxx:39
 ZGlProgram.cxx:40
 ZGlProgram.cxx:41
 ZGlProgram.cxx:42
 ZGlProgram.cxx:43
 ZGlProgram.cxx:44
 ZGlProgram.cxx:45
 ZGlProgram.cxx:46
 ZGlProgram.cxx:47
 ZGlProgram.cxx:48
 ZGlProgram.cxx:49
 ZGlProgram.cxx:50
 ZGlProgram.cxx:51
 ZGlProgram.cxx:52
 ZGlProgram.cxx:53
 ZGlProgram.cxx:54
 ZGlProgram.cxx:55
 ZGlProgram.cxx:56
 ZGlProgram.cxx:57
 ZGlProgram.cxx:58
 ZGlProgram.cxx:59
 ZGlProgram.cxx:60
 ZGlProgram.cxx:61
 ZGlProgram.cxx:62
 ZGlProgram.cxx:63
 ZGlProgram.cxx:64
 ZGlProgram.cxx:65
 ZGlProgram.cxx:66
 ZGlProgram.cxx:67
 ZGlProgram.cxx:68
 ZGlProgram.cxx:69
 ZGlProgram.cxx:70
 ZGlProgram.cxx:71
 ZGlProgram.cxx:72
 ZGlProgram.cxx:73
 ZGlProgram.cxx:74
 ZGlProgram.cxx:75
 ZGlProgram.cxx:76
 ZGlProgram.cxx:77
 ZGlProgram.cxx:78
 ZGlProgram.cxx:79
 ZGlProgram.cxx:80
 ZGlProgram.cxx:81
 ZGlProgram.cxx:82
 ZGlProgram.cxx:83
 ZGlProgram.cxx:84
 ZGlProgram.cxx:85
 ZGlProgram.cxx:86
 ZGlProgram.cxx:87
 ZGlProgram.cxx:88
 ZGlProgram.cxx:89
 ZGlProgram.cxx:90
 ZGlProgram.cxx:91
 ZGlProgram.cxx:92
 ZGlProgram.cxx:93
 ZGlProgram.cxx:94
 ZGlProgram.cxx:95
 ZGlProgram.cxx:96
 ZGlProgram.cxx:97
 ZGlProgram.cxx:98
 ZGlProgram.cxx:99
 ZGlProgram.cxx:100
 ZGlProgram.cxx:101
 ZGlProgram.cxx:102
 ZGlProgram.cxx:103
 ZGlProgram.cxx:104
 ZGlProgram.cxx:105
 ZGlProgram.cxx:106
 ZGlProgram.cxx:107
 ZGlProgram.cxx:108
 ZGlProgram.cxx:109
 ZGlProgram.cxx:110
 ZGlProgram.cxx:111
 ZGlProgram.cxx:112
 ZGlProgram.cxx:113
 ZGlProgram.cxx:114
 ZGlProgram.cxx:115
 ZGlProgram.cxx:116
 ZGlProgram.cxx:117
 ZGlProgram.cxx:118
 ZGlProgram.cxx:119
 ZGlProgram.cxx:120
 ZGlProgram.cxx:121
 ZGlProgram.cxx:122
 ZGlProgram.cxx:123
 ZGlProgram.cxx:124
 ZGlProgram.cxx:125
 ZGlProgram.cxx:126
 ZGlProgram.cxx:127
 ZGlProgram.cxx:128
 ZGlProgram.cxx:129
 ZGlProgram.cxx:130
 ZGlProgram.cxx:131