The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

############################################################
#
# 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.
#
############################################################
use strict;
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__