2746635c61122a4e0c187d61b80c6ff95bd2ae04
[blender.git] / source / gameengine / VideoTexture / ImageMix.h
1 /*
2 -----------------------------------------------------------------------------
3 This source file is part of VideoTexture library
4
5 Copyright (c) 2007 The Zdeno Ash Miklas
6
7 This program is free software; you can redistribute it and/or modify it under
8 the terms of the GNU Lesser General Public License as published by the Free Software
9 Foundation; either version 2 of the License, or (at your option) any later
10 version.
11
12 This program is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
15
16 You should have received a copy of the GNU Lesser General Public License along with
17 this program; if not, write to the Free Software Foundation, Inc., 59 Temple
18 Place - Suite 330, Boston, MA 02111-1307, USA, or go to
19 http://www.gnu.org/copyleft/lesser.txt.
20 -----------------------------------------------------------------------------
21 */
22
23 /** \file ImageMix.h
24  *  \ingroup bgevideotex
25  */
26  
27 #ifndef __IMAGEMIX_H__
28 #define __IMAGEMIX_H__
29
30
31 #include "Common.h"
32
33 #include "ImageBase.h"
34 #include "FilterBase.h"
35
36
37 /// class for source mixing
38 class ImageSourceMix : public ImageSource
39 {
40 public:
41         /// constructor
42         ImageSourceMix (const char * id) : ImageSource(id), m_weight(0x100) {}
43         /// destructor
44         virtual ~ImageSourceMix (void) {}
45
46         /// get offset
47         long long getOffset (void) { return m_offset; }
48         /// set offset
49         void setOffset (unsigned int * firstImg) { m_offset = m_image - firstImg; }
50
51         /// get weight
52         short getWeight (void) { return m_weight; }
53         /// set weight
54         void setWeight (short weight) { m_weight = weight; }
55
56 protected:
57         /// buffer offset to the first source buffer
58         long long m_offset;
59         /// source weight
60         short m_weight;
61 };
62
63
64 /// class for image mixer
65 class ImageMix : public ImageBase
66 {
67 public:
68         /// constructor
69         ImageMix (void) : ImageBase(false) {}
70
71         /// destructor
72         virtual ~ImageMix (void) {}
73
74         /// get weight
75         short getWeight (const char * id);
76         /// set weight
77         bool setWeight (const char * id, short weight);
78
79 protected:
80
81         /// create new source
82         virtual ImageSource * newSource (const char * id) { return new ImageSourceMix(id); }
83
84         /// calculate image from sources and set its availability
85         virtual void calcImage (unsigned int texId, double ts);
86 };
87
88
89 /// pixel filter for image mixer
90 class FilterImageMix : public FilterBase
91 {
92 public:
93         /// constructor
94         FilterImageMix (ImageSourceList & sources) : m_sources(sources) {}
95         /// destructor
96         virtual ~FilterImageMix (void) {}
97
98 protected:
99         /// source list
100         ImageSourceList & m_sources;
101
102         /// filter pixel, source int buffer
103         virtual unsigned int filter (unsigned int * src, short x, short y,
104                 short * size, unsigned int pixSize, unsigned int val = 0)
105         {
106                 // resulting pixel color
107                 int color[] = {0, 0, 0, 0};
108                 // iterate sources
109                 for (ImageSourceList::iterator it = m_sources.begin(); it != m_sources.end(); ++it)
110                 {
111                         // get pointer to mixer source
112                         ImageSourceMix * mixSrc = static_cast<ImageSourceMix*>(*it);
113                         // add weighted source pixel to result
114                         color[0] += mixSrc->getWeight() * (src[mixSrc->getOffset()] & 0xFF);
115                         color[1] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 8) & 0xFF);
116                         color[2] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 16) & 0xFF);
117                         color[3] += mixSrc->getWeight() * ((src[mixSrc->getOffset()] >> 24) & 0xFF);
118                 }
119                 // return resulting color
120                 return ((color[0] >> 8) & 0xFF) | (color[1] & 0xFF00)
121                         | ((color[2] << 8) & 0xFF0000) | ((color[3] << 16) & 0xFF000000);
122         }
123 };
124
125
126 #endif
127