root/as3/FLARToolKit/trunk/libs/Papervision3D/src/org/papervision3d/materials/shaders/EnvMapShader.as

リビジョン 3288, 9.1 kB (コミッタ: rokubou, コミット時期: 3 年 前)

Add Papervison3D.

Line 
1 package org.papervision3d.materials.shaders
2 {
3         import flash.display.BitmapData;
4         import flash.display.BitmapDataChannel;
5         import flash.display.Graphics;
6         import flash.display.Sprite;
7         import flash.filters.DisplacementMapFilter;
8         import flash.filters.DisplacementMapFilterMode;
9         import flash.geom.Matrix;
10         import flash.geom.Point;
11         import flash.geom.Rectangle;
12        
13         import org.papervision3d.core.geom.renderables.Triangle3D;
14         import org.papervision3d.core.geom.renderables.Vertex3DInstance;
15         import org.papervision3d.core.math.Matrix3D;
16         import org.papervision3d.core.math.Number3D;
17         import org.papervision3d.core.proto.LightObject3D;
18         import org.papervision3d.core.render.data.RenderSessionData;
19         import org.papervision3d.core.render.shader.ShaderObjectData;
20         import org.papervision3d.materials.utils.BumpmapGenerator;
21        
22         /**
23          * @Author Ralph Hauwert
24          */
25         public class EnvMapShader extends LightShader implements IShader
26         {
27                 protected var lightmapHalfwidth:Number;
28             protected var lightmapHalfheight:Number;
29                
30                 private var dFilter:DisplacementMapFilter;
31                 private var _envMap:BitmapData;
32                 private var _backEnvMap:BitmapData;
33                 private var _specularMap:BitmapData;
34                 private var _bumpMap:BitmapData;
35                 private var _ambientColor:int;
36                
37                 private static var mapOrigin:Point = new Point(0,0);
38                 private static var origin:Point = new Point(0,0);
39                 private static var triMatrix:Matrix = new Matrix();
40                 private static var transformMatrix:Matrix = new Matrix();
41                 private static var light:Number3D;
42                 private static var p0:Number;
43                 private static var q0:Number;
44                 private static var p1:Number;
45                 private static var q1:Number;
46                 private static var p2:Number;
47                 private static var q2:Number;
48                 private static var v0:Vertex3DInstance;
49                 private static var v1:Vertex3DInstance;
50                 private static var v2:Vertex3DInstance;
51                 private static var currentGraphics:Graphics;
52                 private static var v0x:Number;
53                 private static var v0y:Number;
54                 private static var v0z:Number;
55                 private static var v1x:Number;
56                 private static var v1y:Number;
57                 private static var v1z:Number;
58                 private static var v2x:Number;
59                 private static var v2y:Number;
60                 private static var v2z:Number;
61                 private static var sod:ShaderObjectData;
62                 private static var n0:Number3D;
63                 private static var n1:Number3D;
64                 private static var n2:Number3D;
65                 private static var r:Rectangle;
66                 private static var lm:Matrix3D;
67                
68                 public function EnvMapShader(light:LightObject3D, envmap:BitmapData, backenvmap:BitmapData = null, ambientColor:int=0x000000, bumpMap:BitmapData = null, specularMap:BitmapData = null)
69                 {
70                         super();
71                         this.light = light;
72                         this.envMap = envmap;
73                         if(!backenvmap){
74                                 this.backenvmap = this.envMap.clone();
75                                 this.backenvmap.fillRect(this.backenvmap.rect, ambientColor);
76                         }else{
77                                 this.backenvmap = backenvmap;
78                         }
79                         this.specularMap = specularMap;
80                         this.bumpmap = bumpMap;
81                         this.ambientColor = ambientColor;       
82                 }
83                
84                 /**
85                  * Localized stuff.
86                  */
87                 private static var useMap:BitmapData;
88                 override public function renderLayer(triangle:Triangle3D, renderSessionData:RenderSessionData, sod:ShaderObjectData):void
89                 {
90                         lm = Matrix3D(sod.lightMatrices[this]);
91                        
92                         /*
93                         v0 = triangle.v0.vertex3DInstance;
94                         v1 = triangle.v1.vertex3DInstance;
95                         v2 = triangle.v2.vertex3DInstance;
96                         triangle.v0.normal.copyTo(v0.normal);
97                         triangle.v1.normal.copyTo(v1.normal);
98                         triangle.v2.normal.copyTo(v2.normal);
99                         Matrix3D.multiplyVector3x3(lm, v0.normal);
100                         Matrix3D.multiplyVector3x3(lm, v1.normal);
101                         Matrix3D.multiplyVector3x3(lm, v2.normal);
102                         */
103                        
104                         p0 = lightmapHalfwidth*(triangle.v0.normal.x * lm.n11 + triangle.v0.normal.y * lm.n12 + triangle.v0.normal.z * lm.n13)+lightmapHalfwidth;
105                         q0 = lightmapHalfheight*(triangle.v0.normal.x * lm.n21 + triangle.v0.normal.y * lm.n22 + triangle.v0.normal.z * lm.n23)+lightmapHalfheight;
106                         p1 = lightmapHalfwidth*(triangle.v1.normal.x * lm.n11 + triangle.v1.normal.y * lm.n12 + triangle.v1.normal.z * lm.n13)+lightmapHalfwidth;
107                         q1 = lightmapHalfheight*(triangle.v1.normal.x * lm.n21 + triangle.v1.normal.y * lm.n22 + triangle.v1.normal.z * lm.n23)+lightmapHalfheight;
108                         p2 = lightmapHalfwidth*(triangle.v2.normal.x * lm.n11 + triangle.v2.normal.y * lm.n12 + triangle.v2.normal.z * lm.n13)+lightmapHalfwidth;
109                         q2 = lightmapHalfheight*(triangle.v2.normal.x * lm.n21 + triangle.v2.normal.y * lm.n22 + triangle.v2.normal.z * lm.n23)+lightmapHalfheight;
110                        
111                         triMatrix = sod.uvMatrices[triangle] ? sod.uvMatrices[triangle] : sod.getUVMatrixForTriangle(triangle);
112                         transformMatrix.tx = p0;
113                     transformMatrix.ty = q0;
114                     transformMatrix.a = p1 - p0;
115                     transformMatrix.b = q1 - q0;
116                     transformMatrix.c = p2 - p0;
117                     transformMatrix.d = q2 - q0;
118                         transformMatrix.invert();
119                         transformMatrix.concat(triMatrix);
120                         if(triangle.faceNormal.x * lm.n31 + triangle.faceNormal.y * lm.n32 + triangle.faceNormal.z * lm.n33 > 0){
121                                 useMap = _envMap;
122                         }else{
123                                 useMap = backenvmap;
124                         }
125                         currentGraphics = Sprite(layers[sod.object]).graphics;
126                         currentGraphics.beginBitmapFill(useMap, transformMatrix,false,false);
127                         currentGraphics.moveTo(triMatrix.tx, triMatrix.ty);
128                         currentGraphics.lineTo(triMatrix.a+triMatrix.tx, triMatrix.b+triMatrix.ty);
129                         currentGraphics.lineTo(triMatrix.c+triMatrix.tx, triMatrix.d+triMatrix.ty);
130                         currentGraphics.lineTo(triMatrix.tx, triMatrix.ty);
131                         currentGraphics.endFill();
132                         currentGraphics.lineStyle();
133                 }
134                
135                 private static var ts:Sprite = new Sprite();
136                 override public function renderTri(triangle:Triangle3D, renderSessionData:RenderSessionData, sod:ShaderObjectData,bmp:BitmapData):void
137                 {
138                         lm = Matrix3D(sod.lightMatrices[this]);
139                        
140                         /*
141                         v0 = triangle.v0.vertex3DInstance;
142                         v1 = triangle.v1.vertex3DInstance;
143                         v2 = triangle.v2.vertex3DInstance;
144                         triangle.v0.normal.copyTo(v0.normal);
145                         triangle.v1.normal.copyTo(v1.normal);
146                         triangle.v2.normal.copyTo(v2.normal);
147                         Matrix3D.multiplyVector3x3(lm, v0.normal);
148                         Matrix3D.multiplyVector3x3(lm, v1.normal);
149                         Matrix3D.multiplyVector3x3(lm, v2.normal);
150                         */
151                        
152                         p0 = lightmapHalfwidth*(triangle.v0.normal.x * lm.n11 + triangle.v0.normal.y * lm.n12 + triangle.v0.normal.z * lm.n13)+lightmapHalfwidth;
153                         q0 = lightmapHalfheight*(triangle.v0.normal.x * lm.n21 + triangle.v0.normal.y * lm.n22 + triangle.v0.normal.z * lm.n23)+lightmapHalfheight;
154                         p1 = lightmapHalfwidth*(triangle.v1.normal.x * lm.n11 + triangle.v1.normal.y * lm.n12 + triangle.v1.normal.z * lm.n13)+lightmapHalfwidth;
155                         q1 = lightmapHalfheight*(triangle.v1.normal.x * lm.n21 + triangle.v1.normal.y * lm.n22 + triangle.v1.normal.z * lm.n23)+lightmapHalfheight;
156                         p2 = lightmapHalfwidth*(triangle.v2.normal.x * lm.n11 + triangle.v2.normal.y * lm.n12 + triangle.v2.normal.z * lm.n13)+lightmapHalfwidth;
157                         q2 = lightmapHalfheight*(triangle.v2.normal.x * lm.n21 + triangle.v2.normal.y * lm.n22 + triangle.v2.normal.z * lm.n23)+lightmapHalfheight;
158                        
159                         triMatrix = sod.renderTriangleUVS[triangle] ? sod.renderTriangleUVS[triangle] : sod.getPerTriUVForShader(triangle);
160                         transformMatrix.tx = p0;
161                     transformMatrix.ty = q0;
162                     transformMatrix.a = p1 - p0;
163                     transformMatrix.b = q1 - q0;
164                     transformMatrix.c = p2 - p0;
165                     transformMatrix.d = q2 - q0;
166                         transformMatrix.invert();
167                         transformMatrix.concat(triMatrix);
168                         if(triangle.faceNormal.x * lm.n31 + triangle.faceNormal.y * lm.n32 + triangle.faceNormal.z * lm.n33 > 0){
169                                 useMap = _envMap;
170                         }else{
171                                 useMap = backenvmap;
172                         }
173                        
174                         /*WORK AROUND FOR FAILING DRAWS...TAKE THIS OUT ASAP*/
175                         ts.graphics.clear();
176                         ts.graphics.beginBitmapFill(useMap, transformMatrix, false,false);
177                         ts.graphics.drawRect(0, 0, bmp.rect.width, bmp.rect.height);
178                         ts.graphics.endFill();
179                         bmp.draw(ts, null,null,layerBlendMode, null,false);
180                 }
181                
182                 override public function updateAfterRender(renderSessionData:RenderSessionData, sod:ShaderObjectData):void
183                 {
184                         if(dFilter){
185                                 var s:Sprite = Sprite(layers[sod.object]);
186                                 s.filters = [dFilter];
187                         }
188                 }
189                
190                 public function set bumpmap(bumpmap:BitmapData):void
191                 {
192                         if(_bumpMap){
193                                 dFilter = null;
194                         }
195                         if(bumpmap){
196                                 var map:BitmapData = BumpmapGenerator.generateBumpmapFrom(bumpmap);
197                                 dFilter = new DisplacementMapFilter(map,mapOrigin,BitmapDataChannel.RED,BitmapDataChannel.GREEN,-127,-127,DisplacementMapFilterMode.WRAP,ambientColor,0);
198                                
199                         }else{
200                                 filter = null;
201                         }
202                         _bumpMap = bumpmap;
203                 }
204                
205                 public function get bumpmap():BitmapData
206                 {
207                         return _bumpMap;
208                 }
209                
210                 public function set envMap(lightMap:BitmapData):void
211             {
212                 if(lightMap){
213                         lightmapHalfwidth = lightMap.width/2;
214                         lightmapHalfheight = lightMap.height/2;
215                 }
216                 _envMap = lightMap;
217             }
218
219             public function get envMap():BitmapData
220             {
221                 return _envMap;
222             }
223            
224             public function set specularMap(specularMap:BitmapData):void
225             {
226                 _specularMap = specularMap;
227             }
228            
229             public function get specularMap():BitmapData
230             {
231                 return _specularMap;
232             }
233            
234             public function set ambientColor(ambient:int):void
235                 {
236                         _ambientColor = ambient;
237                 }
238                
239                 public function get ambientColor():int
240                 {
241                         return _ambientColor;
242                 }
243                
244                 public function set backenvmap(envmap:BitmapData):void
245                 {
246                         _backEnvMap = envmap;
247                 }
248                
249                 public function get backenvmap():BitmapData
250                 {
251                         return _backEnvMap;     
252                 }
253                
254         }
255 }
Note: リポジトリブラウザについてのヘルプは TracBrowser を参照してください。