Code archives/3D Graphics - Effects/3D Entity Highlighting
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
'Quite' quickly plots to an image buffer according to the visible 'surfaces' of an entity specified (Fixed a coupla little bugs) | |||||
;----------------------------------------------------------------------------------------------------------------------------------- ;Example ;----------------------------------------------------------------------------------------------------------------------------------- Graphics3D 800,600,32,6 SetBuffer BackBuffer() Cube=CreateSphere() EntityColor Cube,Rand(32,224),Rand(32,224),Rand(32,224) EntityPickMode Cube,2,1 Cam=CreateCamera() MoveEntity Cam,0,0,-5 Local MyImage%=0 PointEntity cam,cube While Not(KeyDown(1)) ;Control Camera Movement MoveEntity Cam,(KeyDown(205)-KeyDown(203))*0.1,0,(KeyDown(200)-KeyDown(208))*0.1 TurnEntity Cam,0,(MouseXSpeed())*0.25,0,True If KeyHit(57) FlushKeys() MyImage=EntityHighlightImage(Cube,Cam) If (MyImage) Then DrawImage MyImage,0,0 Flip WaitKey() End Else UpdateWorld RenderWorld End If Flip Wend ;----------------------------------------------------------------------------------------------------------------------------------- ;Functions ;----------------------------------------------------------------------------------------------------------------------------------- Function EntityHighlightImage%(Entity%,Camera%,RGBa%=-1) If (Not(Entity)) Then Return 0 If (Not (Camera)) Then Return 0 If (Not(((EntityClass(Entity)="Mesh") Or (EntityClass(Entity)="Terrain") Or (EntityClass(Entity)="Plane") Or (EntityClass(Entity)="Mirror") Or (EntityClass(Entity)="MD2") Or (EntityClass(Entity)="BSP")))) Then Return 0 If (Not(EntityVisible(Entity,Camera))) Then Return 0 If (Not(EntityInView(Entity,Camera))) Then Return 0 ; Make a copy so as not to 'harm' the original entity Local WorkingCopy%=CopyEntity(Entity) ;GraphicsWidth() and GraphicsHeight() should match the camera viewport Local W%=GraphicsWidth() Local H%=GraphicsHeight() Local X%,Y% Local RGB Local IterSurface%,Surface%,IterVertex% ;OPTIONAL ; These are really only if you wish to make use of the CropImage() function to restrict output to the highlight only. ;Else, the image dimensions will match the W & H Viewport given above. ; { Local L%=W-1,R%=0,T%=H-1,B%=0 ; } ; Create an Image to draw the highlight separately. Local ReturnImage=CreateImage(W,H) UpdateWorld RenderWorld LockBuffer ImageBuffer(ReturnImage) For IterSurface=1 To CountSurfaces(Entity) Surface=GetSurface(Entity,IterSurface) For IterVertex=0 To CountVertices(Surface)-1 TFormPoint(VertexNX(Surface,IterVertex),VertexNY(Surface,IterVertex),VertexNZ(Surface,IterVertex),Entity,0) CameraProject Camera,TFormedX(),TFormedY(),TFormedZ() X=ProjectedX() Y=ProjectedY() RGB=RGBa((X-(GraphicsWidth() Shr True)/GraphicsWidth())*255,0,(Y-(GraphicsHeight() Shr True)/GraphicsHeight())*255) WritePixelFast X,Y,RGB,ImageBuffer(ReturnImage) ;OPTIONAL ; These are really only if you wish to make use of the CropImage() function to restrict output to the highlight only. ;Else, the image dimensions will match the W & H Viewport given above. ; { If (X<L) Then L=X If (X>R) Then R=X If (Y<T) Then T=Y If (Y>B) Then B=Y ; } Next Next UnlockBuffer ImageBuffer(ReturnImage) ;Free up duplicates FreeEntity WorkingCopy ;OPTIONAL ; These are really only if you wish to make use of the CropImage() function to restrict output to the highlight only. ;Else, the image dimensions will match the W & H Viewport given above. ; { Local CroppedImage If (L*T*R*B) If (((B-T)<1) Or ((R-L)<1)) L=0 T=0 End If CroppedImage=CropImage(ReturnImage,L,T,R,B) ;Free up duplicates FreeImage ReturnImage ReturnImage=CroppedImage End If ; } Return ReturnImage End Function Function CropImage%(Image%,X1%,Y1%,X2%,Y2%) If (Not(Image)) Then Return 0 Local W%=X2-X1 Local H%=Y2-Y1 Local CroppedImage%=CreateImage(W,H) Local XRW%,YRW% Local RGB% LockBuffer ImageBuffer(Image) LockBuffer ImageBuffer(CroppedImage) For XRW=0 To W-1 For YRW=0 To H-1 RGB=ReadPixelFast(XRW+X1,YRW+Y1,ImageBuffer(Image)) WritePixelFast XRW,YRW,RGB,ImageBuffer(CroppedImage) Next Next UnlockBuffer ImageBuffer(Image) UnlockBuffer ImageBuffer(CroppedImage) Return CroppedImage End Function Function RGBa%(R%,G%,B%,a%=0) ; Returns aRGB Value from components. Return ((a% Shl 24) Or (R% Shl 16) Or (G% Shl 8) Or B%) End Function ;_______________________________________________________________________________________________________________________ ;_______________________________________________________________________________________________________________________ Function Red(RGBa_Value%) ; Returns Red component. Return ((RGBa_Value% Shr 16) And 255) End Function ;_______________________________________________________________________________________________________________________ ;_______________________________________________________________________________________________________________________ Function Green(RGBa_Value%) ; Returns Green component. Return ((RGBa_Value% Shr 8) And 255) End Function ;_______________________________________________________________________________________________________________________ ;_______________________________________________________________________________________________________________________ Function Blue(RGBa_Value%) ; Returns Blue component. Return (RGBa_Value% And 255) End Function ;_______________________________________________________________________________________________________________________ ;_______________________________________________________________________________________________________________________ Function Alpha%(RGBa_Value%) ; Returns Alpha component. Return (RGBa_Value% Shr 24 And 255) End Function ;_____________ |
Comments
None.
Code Archives Forum