00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 #include <stdlib.h>
00044 #include <stdio.h>
00045
00046 #include <OSGConfig.h>
00047
00048 #include <OSGGL.h>
00049 #include <OSGGLU.h>
00050
00051 #include <OSGNodePtr.h>
00052 #include <OSGViewport.h>
00053 #include <OSGImage.h>
00054 #include <OSGTextureChunk.h>
00055
00056
00057 #include "OSGTextureGrabBackground.h"
00058
00059 OSG_USING_NAMESPACE
00060
00061
00062
00063
00064
00076
00077
00078
00079
00080
00081
00082
00083
00084 void TextureGrabBackground::initMethod (void)
00085 {
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099 TextureGrabBackground::TextureGrabBackground(void) :
00100 Inherited()
00101 {
00102 }
00103
00104 TextureGrabBackground::TextureGrabBackground(const TextureGrabBackground &source) :
00105 Inherited(source)
00106 {
00107 }
00108
00109 TextureGrabBackground::~TextureGrabBackground(void)
00110 {
00111 }
00112
00113
00114
00115 void TextureGrabBackground::changed(BitVector whichField, UInt32 origin)
00116 {
00117 Inherited::changed(whichField, origin);
00118 }
00119
00120
00121
00122 void TextureGrabBackground::clear(DrawActionBase *action, Viewport *port)
00123 {
00124
00125 TextureChunkPtr t = getTexture();
00126
00127 if(t == NullFC)
00128 {
00129 Inherited::clear(action, port);
00130 return;
00131 }
00132
00133 Int32 pw = port->getPixelWidth(),
00134 ph = port->getPixelHeight();
00135
00136
00137 if(pw < 1 || ph < 1)
00138 return;
00139
00140 ImagePtr i = t->getImage();
00141
00142
00143
00144 if((i->getWidth() <= 1 && i->getHeight() <= 1) ||
00145 (getAutoResize() && (osgabs(i->getWidth() - pw) > 1 ||
00146 osgabs(i->getHeight() - ph) > 1 )
00147 )
00148 )
00149 {
00150 i->set(i->getPixelFormat(), pw, ph);
00151
00152 beginEditCP(t, TextureChunk::ImageFieldMask);
00153 endEditCP (t, TextureChunk::ImageFieldMask);
00154 }
00155
00156 UInt32 w = osgMin((Int32)i->getWidth(), pw);
00157 UInt32 h = osgMin((Int32)i->getHeight(), ph);
00158
00159 glErr("TextureGrabBackground::activate precheck");
00160
00161 action->getWindow()->validateGLObject(t->getGLId());
00162
00163 glErr("TextureGrabBackground::bind precheck");
00164
00165 GLenum bindTarget = getBindTarget(), copyTarget = getCopyTarget();
00166
00167 if(bindTarget == GL_NONE)
00168 {
00169 if(i->getDepth() > 1)
00170 {
00171 FWARNING(("TextureGrabBackground:: 3D textures not "
00172 "supported for this window!\n"));
00173 Inherited::clear(action, port);
00174 return;
00175 }
00176 else if(h > 1) bindTarget = GL_TEXTURE_2D;
00177 else bindTarget = GL_TEXTURE_1D;
00178 }
00179
00180 if(copyTarget == GL_NONE)
00181 copyTarget = bindTarget;
00182
00183 glBindTexture(bindTarget,
00184 action->getWindow()->getGLObjectId(t->getGLId()));
00185
00186 glErr("TextureGrabBackground::copy precheck");
00187
00188 if(copyTarget == GL_TEXTURE_3D)
00189 {
00190 FWARNING(("TextureGrabBackground:: grabbing to 3D textures not "
00191 "supported yet!\n"));
00192 }
00193 else if(copyTarget == GL_TEXTURE_1D)
00194 {
00195 glCopyTexSubImage1D(copyTarget, 0, 0,
00196 port->getPixelLeft(), port->getPixelBottom(),
00197 w);
00198 }
00199 else
00200 {
00201 glCopyTexSubImage2D(copyTarget, 0, 0, 0,
00202 port->getPixelLeft(), port->getPixelBottom(),
00203 w, h);
00204 }
00205
00206 glErr("TextureGrabBackground::copy postcheck");
00207
00208 glBindTexture(bindTarget, 0);
00209
00210
00211 Inherited::clear(action, port);
00212 }
00213
00214
00215
00216 void TextureGrabBackground::dump( UInt32 ,
00217 const BitVector ) const
00218 {
00219 SLOG << "Dump TextureGrabBackground NI" << std::endl;
00220 }
00221
00222
00223
00224
00225
00226 #ifdef OSG_SGI_CC
00227 #pragma set woff 1174
00228 #endif
00229
00230 #ifdef OSG_LINUX_ICC
00231 #pragma warning( disable : 177 )
00232 #endif
00233
00234 namespace
00235 {
00236 static Char8 cvsid_cpp [] = "@(#)$Id: $";
00237 static Char8 cvsid_hpp [] = OSGTEXTUREGRABBACKGROUNDBASE_HEADER_CVSID;
00238 static Char8 cvsid_inl [] = OSGTEXTUREGRABBACKGROUNDBASE_INLINE_CVSID;
00239
00240 static Char8 cvsid_fields_hpp[] = OSGTEXTUREGRABBACKGROUNDFIELDS_HEADER_CVSID;
00241 }
00242
00243 #ifdef __sgi
00244 #pragma reset woff 1174
00245 #endif
00246