here is the code
im trying to grasp the concept, I got the normal mapping program from nvedia, Nice kit, so i need Blitz to utilise it properly. i'll be moving about the map and the boxes are bumped
the media files are
http://www.neomancer.co.uk/ibox_norm.zip
im trying to grasp the concept, I got the normal mapping program from nvedia, Nice kit, so i need Blitz to utilise it properly. i'll be moving about the map and the boxes are bumped
Global camera,worldpivot Global campitch#,camyaw#,mvx#,mvy#,mvz#,temp#,vx#,vy#,vz# Graphics3D 1024,768,0,2 MoveMouse 1024/2,768/2 FlushMouse SetBuffer BackBuffer( ) If GfxDriverCaps3D()<110 Then RuntimeError "Sorry, your graphics card does not support cubic environment maps." ;camera camera = CreateCamera( ) PositionEntity camera, 0, 2, -16 ;load model model = LoadMesh("box_1.b3d") ;model = CreateCube() ;RotateMesh model,-90,0,0 PositionEntity model,0,0,0 ScaleEntity model,.1,.1,.1 EntityFX model,1 normaltex = LoadTexture("ibox_norm.bmp",0) TextureBlend normaltex,4 EntityTexture model, normaltex,0,0 pivot=CreatePivot() mylight = CreateSphere(2) light=CreateLight(1,mylight) LightRange light,200 ScaleEntity mylight,0.1,0.1,0.1 EntityFX mylight,1 PositionEntity mylight,0,0,-8 AmbientLight 100,100,100 norm=1 While Not KeyHit( 1 ) If KeyHit(57) norm=1-norm If norm=1 ShowEntity model HideEntity lomodel Else ShowEntity lomodel HideEntity model EndIf EndIf ;PointEntity camera,model ;MoveEntity camera,.01,0,0 ;TurnEntity camera,-20,0,0 freelook If KeyDown(203) Then TurnEntity(model,0,3.1,0) If KeyDown(205) Then TurnEntity(model,0,-3.1,0) ;mylight rot#=rot#+1.5 rrot = EntityYaw(model) xrot#=Cos(rot)*8 zrot#=Sin(rot)*8 yrot#=Cos(rot/2)*8 PointEntity mylight,model PositionEntity mylight,EntityX(model)+xrot,EntityY(model) + yrot,EntityZ(model)+zrot ;the dot3 light PositionEntity pivot, EntityX(model),EntityY(model),EntityZ(model) RotateEntity pivot,EntityPitch(mylight),EntityYaw(mylight)+180,0 MoveEntity pivot, 0, 0, 1 doty# = (EntityY(model)) - EntityY(pivot) ; then work out the Light possitions :) AppTitle dotx r#=(EntityX(pivot)+1.0) * 128.0 g#=(-EntityZ(pivot)+1.0) * 128.0 b#=(-doty+1.0) * 128.0 ;EntityColor model,r,g,b ;NormalMapMesh model,0,10,10,0 entityLight model,mylight,1.6,False UpdateWorld RenderWorld Text 1024/2,768-16,"- Hit space to toggle -",1,1 If norm Text 0,0,"68,176 simulated polygons with normal mapping." Else Text 0,0,"802 polygons." EndIf Flip Wend End ;camera freelook Function freelook() mxspd#=MouseXSpeed()*0.25 myspd#=MouseYSpeed()*0.25 ;MoveMouse GraphicsWidth()/2,GraphicsHeight()/2 campitch=campitch+myspd If campitch<-85 Then campitch=-85 If campitch>85 Then campitch=85 RotateEntity camera,campitch,EntityYaw(camera)-mxspd,0 ;If KeyDown(203) Then mvx=mvx-.3 ;If KeyDown(205) Then mvx=mvx+.3 If KeyDown(200) Then mvz=mvz+.3 If KeyDown(208) Then mvz=mvz-.3 If KeyDown(30) Then mvx=mvx-.3 If KeyDown(32) Then mvx=mvx+.3 If KeyDown(17) Then mvz=mvz+.3 If KeyDown(31) Then mvz=mvz-.3 mvx#=mvx*.8 mvy#=mvy*.8 mvz#=mvz*.8 MoveEntity camera,mvx,mvy,mvz End Function Function entityLight(entity,light,inten#=0.5,hull=False) ox#=EntityX(light) oy#=EntityY(light) oz#=EntityZ(light) ;inten =0.5 If Not hull inten=1.-inten tp=CreateCube() PositionEntity tp,EntityX(light),EntityY(light),EntityZ(light) TFormPoint ox,oy,oz,tp,entity ;FreeEntity tp light=tp PositionEntity light,TFormedX(),TFormedY(),TFormedZ() ;Transpose light into dx# =(EntityX(light)-EntityX( entity));*inten dy# =(EntityY(light)-EntityY( entity));*inten dz# =(EntityZ(light)-EntityZ( entity));*inten nl#=Sqr(dx*dx+dy*dy+dz*dz) nx#=dx/nl ny#=dy/nl nz#=dz/nl nl#=(nl*10.-255.)/255. nl=1.-nl If nl>1. nl=1 If nl<0. nl=0 nl=in nx=nx*inten ny=ny*inten nz=nz*inten ;nz=(Sgn(nz))+nz ;nx=(Sgn(nx))+nx ;ny=(Sgn(ny))+ny ;If nx<0 nx ;FreeEntity tp ;EntityColor entity,128.+(128.*nx),128.+(128.*nz),128.+(128.*ny) EntityColor entity,128.+(128.*nx),128.+(128.*ny),128.+(128.*nz) ;EntityColor entity,256+(256*nx),256.0+(256*ny),256.0+(256*nz) ;PositionEntity light,ox,oy,oz ;return light. End Function Function NormalMapMesh(mesh,x#=-1,y#=-1,z#=1,style=0) If EntityClass(mesh)="Mesh" temp=CreatePivot() If style=0 AlignToVector temp,x,y,z,3 RotateEntity temp,EntityPitch(temp),EntityYaw(temp),0 EndIf For s=1 To CountSurfaces(mesh) surf=GetSurface(mesh,s) For v=0 To CountVertices(surf)-1 Select style ;Directional light Case 0 TFormNormal VertexNX(surf,v),VertexNY(surf,v),VertexNZ(surf,v),mesh,temp r#=(1.0-TFormedX())*127.5 g#=(1.0-TFormedY())*127.5 b#=(1.0-TFormedZ())*127.5 If TFormedZ()>0 b=0 ;Point light Case 1 RotateEntity temp,0,0,0 TFormPoint VertexX(surf,v),VertexY(surf,v),VertexZ(surf,v),mesh,temp AlignToVector temp,TFormedX(),TFormedY(),TFormedZ(),3 RotateEntity temp,EntityPitch(temp),EntityYaw(temp),0 TFormNormal VertexNX(surf,v),VertexNY(surf,v),VertexNZ(surf,v),mesh,temp r#=(1.0-TFormedX())*127.5 g#=(1.0-TFormedY())*127.5 b#=(1.0-TFormedZ())*127.5 If TFormedZ()>0 b=0 TFormPoint VertexX(surf,v),VertexY(surf,v),VertexZ(surf,v),mesh,temp d#=PointDistance(TFormedX(),TFormedY(),TFormedZ(),0,0,0) range#=200 If d<range d#=Sqr((range-d)/range) b#=d*255 Else b=0 EndIf End Select VertexColor surf,v,r,g,b Next Next FreeEntity temp EndIf For c=1 To CountChildren(mesh) normalmapmesh GetChild(mesh,c) Next End Function Function PointDistance#(Ax#,Ay#,Az#,Bx#,By#,Bz#) Return Sqr((ax-bx)^2.0+(ay-by)^2.0+(az-bz)^2.0) End Function
the media files are
http://www.neomancer.co.uk/ibox_norm.zip