CloudyDay
 All Classes Functions Variables Enumerations
Grass.h
1 #pragma once
2 #include "Scene.h"
3 #include "Terrain.h"
4 #include <osg/Geometry>
5 #include <osg/State>
6 #include <osg/ArrayDispatchers>
7 #include <osg/PrimitiveSet>
8 #include <osg/Shader>
9 #include <osg/Program>
10 
11 #include <osg/ClearNode>
12 #include <osgViewer/Viewer>
13 #include <osg/GL>
14 #include <osgUtil/RenderStage>
15 #include <osg/PolygonOffset>
16 #include <osg/BlendFunc>
17 #include <osg/BlendEquation>
18 #include <osg/Depth>
19 
20 #include <osg/Shader>
21 #include <osg/Vec3>
22 #include <osg/Matrix>
23 
24 namespace osgCloudyDay
25 {
29  class GrassLightCallback : public osg::NodeCallback
30  {
31  public:
32  GrassLightCallback(void)
33  {
34 
35  }
36 
37  virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
38  {
39  osgUtil::CullVisitor* cv = dynamic_cast<osgUtil::CullVisitor*>(nv);
40  osg::ref_ptr<osg::Geode> geometry = dynamic_cast<osg::Geode*> (node);
41 
42  if(geometry && cv)
43  {
44  osg::Matrixd view(cv->getCurrentCamera()->getViewMatrix());
45  osg::Matrixd invViewMatrix = osg::Matrixd::inverse(view);
46  osg::Matrixd modelview(*cv->getModelViewMatrix());
47  osg::Matrixd model = modelview*invViewMatrix;
48  osg::Matrixd proj(cv->getCurrentCamera()->getProjectionMatrix());
49 
50  geometry->getOrCreateStateSet()->getUniform("ModelMatrix")->set(model);
51  geometry->getOrCreateStateSet()->getUniform("ViewMatrix")->set(view);
52  geometry->getOrCreateStateSet()->getUniform("ProjectionMatrix")->set(proj);
53 
54  geometry->getOrCreateStateSet()->getUniform("light_mv_matrix")->set(osgCloudyDay::Scene::GetLightCamera()->getViewMatrix());
55 
56 
57  #ifdef SHADOW_MAPPING
58  geometry->getOrCreateStateSet()->getUniform("light_proj_matrix")->set(osgCloudyDay::Scene::GetProjectionMatrix_Light());
59  geometry->getOrCreateStateSet()->getUniform("light_mv_matrix")->set(osgCloudyDay::Scene::GetLightCamera()->getViewMatrix());
60  #endif
61  }
62  traverse(node, nv);
63  }
64  };
65 
69  class Grass
70  {
71  public:
72  Grass(void);
73  ~Grass(void);
74 
75  void Initialize(osgCloudyDay::TerrainConfig* m_config);
76 
77  static void CreateTexture();
78  static void CreateShader();
79  static void SetDefinitionOfTerrain(osg::Texture* definition);
80  static void SetHeightofTerrain(osg::Texture* heightmap);
81 
82  static osg::ref_ptr<osg::Program> m_grassProg;
83  static osg::ref_ptr<osg::Texture2D> tex_tree;
84  static float* heightmap_data;
85  static osg::Vec4* definition_data;
86  static int heightmap_height;
87  static int heightmap_width;
88 
89  osg::MatrixTransform* GetGeode();
90 
91  protected:
92  void SetArrays();
93  void SetUniforms(osg::ref_ptr<osg::StateSet> nodess4);
94 
95  osg::ref_ptr<osg::Geode> geode;
96  osg::ref_ptr<osg::Geometry> geometry;
97  osg::ref_ptr<osg::Vec3Array> m_vertices;
98  osg::ref_ptr<osg::UIntArray> m_indices;
99 
100  osg::ref_ptr<osg::MatrixTransform> trans;
101 
102  };
103 }