############################################################ # # OpenGL::Shader::Common - Copyright 2007 Graphcomp - ALL RIGHTS RESERVED # Author: Bob "grafman" Free - grafman@graphcomp.com # # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. # ############################################################ package OpenGL::Shader::Common; use strict; use warnings; use Carp; our $VERSION = '1.01'; =head1 NAME OpenGL::Shader::Common - base class for use with OpenGL::Shader =head1 SYNOPSIS # Instantiate a shader use OpenGL::Shader; my $shdr = new OpenGL::Shader(); =head1 DESCRIPTION This module provides a base class for OpenGL shader types. Example usage: use OpenGL::Shader; my $shdr = new OpenGL::Shader(); ########## # Methods defined in this module: # Get shader type. my $type = $shdr->GetType(); # Get shader version my $ver = $shdr->GetVersion(); # Get shader description my $desc = $shdr->GetDescription(); # Load shader files. my $stat = $shdr->LoadFiles($fragment_file,$vertex_file); # Get shader GL constants. my $fragment_const = $shdr->GetFragmentConstant(); my $vertex_const = $shdr->GetVertexConstant(); # Get objects. my $fragment_shader = $shdr->GetFragmentShader(); my $vertex_shader = $shdr->GetVertexShader(); my $program = $shdr->GetProgram(); ########## # Methods defined in subclasses: # Load shader text. $shdr->Load($fragment,$vertex); # Enable shader. $shdr->Enable(); # Set Vertex Attribute my $attr_id = $self->MapAttr($attr_name); glVertexAttrib4fARB($attr_id,$x,$y,$z,$w); # Get Global Variable ID (uniform/env) my $var_id = $self->Map($var_name); # Set float4 vector variable $stat = $self->SetVector($var_name,$x,$y,$z,$w); # Set float4x4 matrix via OGA $stat = $self->SetMatrix($var_name,$oga); # Disable shader. $shdr->Disable(); # Destructor. $shdr->DESTROY(); =head1 AUTHOR Bob "grafman" Free - grafman@graphcomp.com. Copyright 2007 Graphcomp - ALL RIGHTS RESERVED This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut # Base constructor sub new { my $this = shift; my $class = ref($this) || $this; my($type) = @_; my $self = bless {}, $class; $self->{type} = uc($type) if defined $type; $self; } # Get shader type sub GetType { my($self) = @_; return $self->{type}; } # Get shader version sub GetVersion { my($self) = @_; return $self->{version}; } # Get shader description sub GetDescription { my($self) = @_; return $self->{description}; } # Get fragment shader constant sub GetFragmentConstant { my($self) = @_; return $self->{fragment_const}; } # Get vertex shader constant sub GetVertexConstant { my($self) = @_; return $self->{vertex_const}; } # Get fragment shader ID sub GetFragmentShader { my($self) = @_; return $self->{fragment_id}; } # Get vertex shader ID sub GetVertexShader { my($self) = @_; return $self->{vertex_id}; } # Get shader program object sub GetProgram { my($self) = @_; return $self->{program}; } # Load shader files sub LoadFiles { my($self,$fragment_file,$vertex_file) = @_; my $fragment = ''; if ($fragment_file) { return "Does not exist: $fragment_file" if (!-e $fragment_file); $fragment = $self->read_file($fragment_file); return "Empty fragment file" if (!$fragment); } my $vertex = ''; if ($fragment_file) { return "Does not exist: $vertex_file" if (!-e $vertex_file); $vertex = $self->read_file($vertex_file); return "Empty vertex file" if (!$vertex); } return $self->Load($fragment,$vertex); } # Read file sub read_file { my($self,$file) = @_; return undef if (!open(FILE,$file)); my @data = <FILE>; close(FILE); return join('',@data); } 1; __END__