; ID: 727; Author: Jeppe Nielsen; Date: 2003-06-24 19:34:01; Title: Break the Glass; Description: Shoot glass with the mouse.;Break glass example, by Jeppe Nielsen 2003Type glassField eField sField w#,h#Field sx#,sy#Field brokenEnd TypeType glasspieceField pField pivot[3]Field x#,y#,z#Field vx#,vy#,vz#Field pitch#,yaw#,roll#Field g.glassField indexEnd TypeConst gravity#=0.004Graphics3D 800,600,16,2pivot=CreatePivot()camera=CreateCamera(pivot)CameraClsColor camera,255,255,255MoveEntity camera,0,1,-4;cube=CreateCube();PositionEntity cube,0,0,0;FlipMesh cubelight=CreateLight(1)RotateEntity light,-10,40,0.label g.glass=glassnew(2,2,20,20)PositionEntity ge,0,0,-1g.glass=glassnew(2,2,20,20)PositionEntity ge,0,0,1g.glass=glassnew(2,2,20,20)PositionEntity ge,0,0,-1TurnEntity ge,0,90,0g.glass=glassnew(2,2,20,20)PositionEntity ge,2,0,-1TurnEntity ge,0,90,0Color 0,0,0RepeatTurnEntity pivot,0,1,0If MouseHit(1)>0p=CameraPick(camera,MouseX(),MouseY())g.glass=Last glassWhile g<>NullIf ge=pglassbreak(g)ExitEndIfg=Before gWendEndIfglassupdate()RenderWorld()mx=MouseX()my=MouseY()Text 400,20,"SHOOT the glass cube :)",1Oval mx-30,my-30,60,60,0Plot mx,myFlipIf KeyHit(2)Goto labelEndIfUntil KeyDown(1)EndFunction glassnew.glass(wid#,hei#,secx,secy,parent=0)g.glass=New glassgw#=wid#gh#=hei#ge=CreateMesh(parent)gs=CreateSurface(ge)dx#=1/Float(secx)dy#=1/Float(secy)gsx#=dx#gsy#=dy#y#=0For yy=1 To secyx#=0For xx=1 To secxgp.glasspiece=New glasspiecegpg=ggpindex=AddVertex(gs,x#,y#,0,x#,y#,0)AddVertex(gs,x#+dx#,y#,0,x#+dx#,y#,0)AddVertex(gs,x#,y#+dy#,0,x#,y#+dy#,0)AddVertex(gs,x#+dx#,y#+dy#,0,x#+dx#,y#+dy#,0)AddTriangle gs,gpindex,gpindex+3,gpindex+1AddTriangle gs,gpindex,gpindex+3,gpindex+2x#=x#+dx#Nexty#=y#+dy#NextScaleMesh ge,wid#,hei#,1EntityFX ge,16EntityPickMode ge,2EntityColor ge,0,0,255EntityAlpha ge,0.5Return gEnd FunctionFunction glassbreak(g.glass)If groken=1 Then Returngroken=1For gp.glasspiece=Each glasspieceIf gpg=ggpp=CreatePivot()gpx#=(VertexX(gs,gpindex)+VertexX(gs,gpindex+3))/2gpy#=(VertexY(gs,gpindex)+VertexY(gs,gpindex+3))/2gpz#=(VertexZ(gs,gpindex)+VertexZ(gs,gpindex+3))/2gpvx#=Rnd(-.02,.02)gpvy#=Rnd(-.02,.02)gpvz#=Rnd(-.02,.02)gppitch#=Rnd(-2,2)gpyaw#=Rnd(-2,2)gpoll#=Rnd(-2,2)PositionEntity gpp,gpx,gpy,gpzFor n=0 To 3gppivot[n]=CreatePivot(gpp)PositionEntity gppivot[n],VertexX(gs,gpindex+n),VertexY(gs,gpindex+n),VertexZ(gs,gpindex+n),1NextEndIfNextEnd FunctionFunction glassupdate()For g.glass=Each glassIf groken=1For gp.glasspiece=Each glasspieceIf gpg=ggpvy=gpvy-gravity#gpx=gpx+gpvxgpy=gpy+gpvygpz=gpz+gpvzPositionEntity gpp,gpx+gpgsx#/2,gpy+gpgsy#/2,gpz,1TurnEntity gpp,gppitch,gpyaw,gpollFor n=0 To 3VertexCoords gpgs,gpindex+n,EntityX(gppivot[n],1),EntityY(gppivot[n],1),EntityZ(gppivot[n],1)NextIf gpy<-10 Then glassdelete(g)EndIfNextEndIfNextEnd FunctionFunction glassdelete(g.glass)For gp.glasspiece=Each glasspieceIf gpg=gFor n=0 To 3FreeEntity gppivot[n]NextFreeEntity gppDelete gpEndIfNextFreeEntity geDelete gEnd Function