1 | #include "myTerrainTechnique.h" |
---|
2 | #include <osgTerrain/TerrainTile> |
---|
3 | |
---|
4 | using namespace osgTerrain; |
---|
5 | |
---|
6 | myTerrainTechnique::myTerrainTechnique(void) : osgTerrain::GeometryTechnique() |
---|
7 | { |
---|
8 | //OSG_ALWAYS<<className()<<"Constructed by Constructor"<<std::endl; |
---|
9 | |
---|
10 | } |
---|
11 | |
---|
12 | myTerrainTechnique::myTerrainTechnique(const GeometryTechnique& TerrainTechnique,const osg::CopyOp& copyop): |
---|
13 | osgTerrain::GeometryTechnique(TerrainTechnique,copyop) |
---|
14 | { |
---|
15 | //OSG_ALWAYS<<className()<<"Constructed by Copy-Constructor"<<std::endl; |
---|
16 | } |
---|
17 | |
---|
18 | myTerrainTechnique::~myTerrainTechnique(void) |
---|
19 | { |
---|
20 | } |
---|
21 | |
---|
22 | void myTerrainTechnique::init(int dirtyMask, bool assumeMultiThreaded) |
---|
23 | { |
---|
24 | /* The heightfield es extracted from the tile in the techniques init function. technique->init() calls technique->generateGeometry() which creates the drawable according to the heightfield. |
---|
25 | To modify the height, the heightfield must be modified prior to the original techniques init() function. |
---|
26 | |
---|
27 | To modiy the drawable shape (e.g. Cutting wholes in the area), the function technique->generateGeometry() must be modified. |
---|
28 | */ |
---|
29 | |
---|
30 | HeightFieldLayer* hfl = dynamic_cast<HeightFieldLayer*>( getTerrainTile()->getElevationLayer() ); |
---|
31 | osg::HeightField* h = hfl->getHeightField(); |
---|
32 | h->setHeight( 0,0, 1000); |
---|
33 | |
---|
34 | ImageLayer* il = dynamic_cast<ImageLayer*>( getTerrainTile()->getColorLayer(0) ); |
---|
35 | osg::Image* img = il->getImage(); |
---|
36 | //img->setInternalTextureFormat( GL_RGBA ); |
---|
37 | |
---|
38 | if( img->getPixelFormat() == GL_RGBA ) |
---|
39 | OSG_ALWAYS << "Format ist RGBA" << std::endl; |
---|
40 | if( img->getPixelFormat() == GL_RGB ) |
---|
41 | OSG_ALWAYS << "Format ist RGB" << std::endl; |
---|
42 | if( img->getPixelFormat() == GL_COMPRESSED_RGB_S3TC_DXT1_EXT ) |
---|
43 | OSG_ALWAYS << "Format ist GL_COMPRESSED_RGB_S3TC_DXT1_EXT" << std::endl; |
---|
44 | |
---|
45 | |
---|
46 | |
---|
47 | //osg::ref_ptr<osg::Image> img2 = new osg::Image(); |
---|
48 | //img2->setInternalTextureFormat( GL_RGBA ); |
---|
49 | //OSG_ALWAYS << "test: " << std::hex << img->getPixelFormat() << std::endl; |
---|
50 | |
---|
51 | GeometryTechnique::init(dirtyMask, assumeMultiThreaded); |
---|
52 | } |
---|
53 | |
---|
54 | void myTerrainTechnique::ConvertImage(osg::ref_ptr<osg::Image> a_toImage, osg::ref_ptr<osg::Image> a_fromImage, GLenum a_pixelFormat, GLenum a_dataType) |
---|
55 | { |
---|
56 | GLenum dataType = a_fromImage -> getDataType(); |
---|
57 | |
---|
58 | //setInternalTextureFormat( 0); // tmp |
---|
59 | a_toImage -> allocateImage( |
---|
60 | a_fromImage -> s(), |
---|
61 | a_fromImage -> t(), |
---|
62 | a_fromImage -> r(), |
---|
63 | a_pixelFormat, a_dataType, a_fromImage -> getPacking()); |
---|
64 | |
---|
65 | //// Wenn Quelle und Ziel RGBA sind |
---|
66 | //if( a_toImage -> getPixelFormat() == GL_RGBA && a_fromImage -> getPixelFormat() == GL_RGBA) |
---|
67 | //{ |
---|
68 | // unsigned nr = a_fromImage->t(); |
---|
69 | // unsigned nc = a_fromImage->s(); |
---|
70 | // for (unsigned r = 0; r < nr; ++r) |
---|
71 | // { |
---|
72 | // for (unsigned c = 0; c < nc; ++c) |
---|
73 | // { |
---|
74 | // unsigned char * fromPixelData = a_fromImage -> data(c, nr-r-1); |
---|
75 | // unsigned char * toPixelData = a_toImage -> data(c, nr-r-1); |
---|
76 | |
---|
77 | // // Copy r, g, b, a. |
---|
78 | // for( int component = 0; component < 4; ++ component) |
---|
79 | // { |
---|
80 | // My_OSG_Library::OSG_PixelComponent pixelComponent( a_fromImage -> getDataType(), fromPixelData, component /* r, g, b, a */); |
---|
81 | // pixelComponent.Store( a_toImage -> getDataType(), toPixelData, component); |
---|
82 | // } |
---|
83 | // } |
---|
84 | // } |
---|
85 | //} |
---|
86 | //else |
---|
87 | // Wenn Quelle RGB ist und Ziel RGBA |
---|
88 | //if( a_toImage -> getPixelFormat() == GL_RGBA && a_fromImage -> getPixelFormat() == GL_RGB) |
---|
89 | //{ |
---|
90 | // unsigned nr = a_fromImage -> t(); |
---|
91 | // unsigned nc = a_fromImage -> s(); |
---|
92 | // for (unsigned r = 0; r < nr; ++r) |
---|
93 | // { |
---|
94 | // for (unsigned c = 0; c < nc; ++c) |
---|
95 | // { |
---|
96 | // unsigned char * fromPixelData = a_fromImage -> data(c, nr-r-1); |
---|
97 | // unsigned char * toPixelData = a_toImage -> data(c, nr-r-1); |
---|
98 | |
---|
99 | // // Copy r, g, b. |
---|
100 | // for( int component = 0; component < 3; ++ component) |
---|
101 | // { |
---|
102 | // My_OSG_Library::OSG_PixelComponent pixelComponent( a_fromImage -> getDataType(), fromPixelData, component /* r, g, b */); |
---|
103 | // pixelComponent.Store( a_toImage -> getDataType(), toPixelData, component); |
---|
104 | // } |
---|
105 | |
---|
106 | // // Initialize alpha to opaque. |
---|
107 | // My_OSG_Library::OSG_PixelComponent::One().Store( a_toImage -> getDataType(), toPixelData, 3); |
---|
108 | // } |
---|
109 | // } |
---|
110 | //} |
---|
111 | } |
---|