Code archives/3D Graphics - Mesh/AddSurfaceToOtherSurface(Surface,Mesh,OSurface,OMesh)
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| merges a surface with another surface (alternative to addmesh) | |||||
;AddSurfaceToOtherSurface(Surface,Mesh,OSurface,OMesh)
;merges a surface with another surface (alternative to addmesh)
;
Graphics3D(1000,625,32,2)
SeedRnd(MilliSecs())
;Input
Global MX%
Global MY%
Global MXDiff%
Global MYDiff%
Global Camera = CreateCamera()
CameraViewport(Camera,0,0,GraphicsWidth(),GraphicsHeight())
CameraRange(Camera,0.1,100)
CameraClsColor(Camera,000,000,000)
Origine = CreateCube()
ScaleMesh(Origine,0.01,0.01,0.01)
EntityColor(Origine,255,000,255)
EntityFX(Origine,1)
;DLight
Global DLight = CreateLight(1)
LightColor(DLight,192,192,192)
PositionEntity(DLight,0,1000,-1000,True)
RotateEntity(DLight,45,0,0,True)
AmbientLight(019*2,019*2,019*2)
;InteractionMode
Global InteractionMode%
Const C2D% = 1
Const C3D% = 2
InitializeInteractionMode()
;Ghost
Global GhostRoot
Global GhostRootYaw#
Global GhostEyes
Global GhostEyesPitch#
BuildGhost()
InitializeGhost()
;XCube = LoadMesh("cube 201610011115.b3d")
;ScaleMesh(XCube,0.01,0.01,0.01)
XCube = CreateCube()
ScaleMesh(XCube,1.0/2,1.0/2,1.0/2)
HideEntity(XCube)
DebugLog("Cube has "+CountVertices(GetSurface(XCube,1))+"vertices and "+CountTriangles(GetSurface(XCube,1))+"triangles")
;XCylinder = LoadMesh("cylinder16 201610011126.b3d")
;ScaleMesh(XCylinder,0.01,0.01,0.01)
XCylinder = CreateCylinder(16)
ScaleMesh(XCylinder,1.0/2,1.0/2,1.0/2)
HideEntity(XCylinder)
DebugLog("Cylinder has "+CountVertices(GetSurface(XCylinder,1))+"vertices and "+CountTriangles(GetSurface(XCylinder,1))+"triangles")
;XSphere = LoadMesh("sphere16 201610011129.b3d")
;ScaleMesh(XSphere,0.01,0.01,0.01)
XSphere = CreateSphere(8)
ScaleMesh(XSphere,1.0/2,1.0/2,1.0/2)
HideEntity(XSphere)
DebugLog("Sphere has "+CountVertices(GetSurface(XSphere,1))+"vertices and "+CountTriangles(GetSurface(XSphere,1))+"triangles")
Global FinalShape = CreateMesh()
CreateSurface(FinalShape)
;add a cube to the finalshape
TPart = CopyMesh(XCube)
PositionMesh(TPart,0,0.5,0)
AddSurfaceToOtherSurface(GetSurface(TPart,1),TPart,GetSurface(FinalShape,1),FinalShape)
FreeEntity(TPart)
;add a cylinder to the finalshape
TPart = CopyMesh(XCylinder)
PositionMesh(TPart,0,1.0+0.5,0)
AddSurfaceToOtherSurface(GetSurface(TPart,1),TPart,GetSurface(FinalShape,1),FinalShape)
FreeEntity(TPart)
;add a sphere to the finalshape
TPart = CopyMesh(XSphere)
PositionMesh(TPart,0,1.0+1.0+0.5,0)
AddSurfaceToOtherSurface(GetSurface(TPart,1),TPart,GetSurface(FinalShape,1),FinalShape)
FreeEntity(TPart)
DebugLog("FinalShape has "+CountVertices(GetSurface(FinalShape,1))+"vertices and "+CountTriangles(GetSurface(FinalShape,1))+"triangles")
;ColorSurfaceWithBrush(GetSurface(FinalShape,1),Rand(025,255),Rand(025,255),Rand(025,255),1.0)
EntityColor(FinalShape,Rand(025,255),Rand(025,255),Rand(025,255))
EntityAlpha(FinalShape,1.0)
EntityFX(FinalShape,0)
EntityBlend(FinalShape,1)
PositionEntity(GhostRoot,0,1.65,-5,True)
Global MainLoopTimer = CreateTimer(30)
Main()
End()
Function Main()
Repeat
MainLoopMsStart% = MilliSecs()
GetInput()
UpdateInteractionMode()
If( InteractionMode = C2D )
;
Else If( InteractionMode = C3D )
UpdateGhost()
EndIf
TurnEntity(FinalShape,0,1.0,0)
PositionRotateEntityLikeOtherEntity(Camera,GhostEyes)
WireFrame(False)
If( KeyDown(2)=1 )
WireFrame(True)
EndIf
SetBuffer(BackBuffer())
Render3dMsStart% = MilliSecs()
RenderWorld()
Render3dMsTime% = MilliSecs()- Render3dMsStart
Color(255,255,255)
CText("FPS = "+FPS,0,0)
CText("Render3dMsTime = "+Render3dMsTime,0,15)
CText("Tris = "+TrisRendered(),0,30)
;Flip(1)
WaitTimer(MainLoopTimer)
VWait():Flip(False)
MainLoopMsTime = MilliSecs() - MainLoopMsStart
If( MainLoopMsTime <= 1 )
MainLoopMsTime = 1
EndIf
FPS% = 1000.0/MainLoopMsTime
Until( KeyDown(1)=1 )
End Function
Function CText(TextStr$,PX%,PY%)
Text(PX,PY,TextStr,False,False)
End Function
Function PositionEntityLikeOtherEntity(Entity,OEntity)
PositionEntity(Entity,EntityX(OEntity,True),EntityY(OEntity,True),EntityZ(OEntity,True),True)
End Function
Function RotateEntityLikeOtherEntity(Entity,OEntity)
RotateEntity(Entity,EntityPitch(OEntity,True),EntityYaw(OEntity,True),EntityRoll(OEntity,True),True)
End Function
Function PositionRotateEntityLikeOtherEntity(Entity,OEntity)
PositionEntity(Entity,EntityX(OEntity,True),EntityY(OEntity,True),EntityZ(OEntity,True),True)
RotateEntity(Entity,EntityPitch(OEntity,True),EntityYaw(OEntity,True),EntityRoll(OEntity,True),True)
End Function
Function InitializeInteractionMode()
InteractionMode = C3D
HidePointer()
End Function
Function UpdateInteractionMode()
If( KeyHit(15)=1 )
If( InteractionMode = C2D )
InteractionMode = C3D
HidePointer()
Else If( InteractionMode = C3D )
InteractionMode = C2D
ShowPointer()
EndIf
EndIf
End Function
Function BuildGhost()
GhostRoot = CreatePivot()
GhostEyes = CreatePivot()
PositionRotateEntityLikeOtherEntity(GhostEyes,GhostRoot)
EntityParent(GhostEyes,GhostRoot,True)
End Function
Function InitializeGhost()
PositionEntity(GhostRoot,0,0,-3,True)
End Function
Function UpdateGhost()
MoveMouse(GraphicsWidth()/2,GraphicsHeight()/2)
GhostRootYaw = GhostRootYaw - Float(MXDiff)/10
RotateEntity(GhostRoot,0,GhostRootYaw,0,False)
GhostEyesPitch = GhostEyesPitch + Float(MYDiff)/10
If( GhostEyesPitch < -89 )
GhostEyesPitch = -89
Else If( GhostEyesPitch > 89 )
GhostEyesPitch = 89
EndIf
RotateEntity(GhostEyes,GhostEyesPitch,0,0,False)
If( KeyDown(42) = 0 And KeyDown(29) = 0 )
Speed# = 0.1
Else If( KeyDown(42) = 1 And KeyDown(29) = 0 )
Speed# = 1
Else If( KeyDown(42) = 0 And KeyDown(29) = 1 )
Speed# = 0.01
EndIf
If( KeyDown(17)=1 Or MouseDown(1)=1 )
MoveEntity(GhostRoot,0,0,Speed)
Else If( KeyDown(31)=1 Or MouseDown(2)=1 )
MoveEntity(GhostRoot,0,0,-Speed)
EndIf
If( KeyDown(30)=1 )
MoveEntity(GhostRoot,-Speed,0,0)
Else If( KeyDown(32)=1 )
MoveEntity(GhostRoot,Speed,0,0)
EndIf
If( KeyDown(16)=1 )
MoveEntity(GhostRoot,0,-Speed,0)
Else If( KeyDown(18)=1 )
MoveEntity(GhostRoot,0,Speed,0)
EndIf
End Function
Function GetInput()
MX = MouseX()
MY = MouseY()
MXDiff = MouseXSpeed()
MYDiff = MouseYSpeed()
End Function
;vertices+triangles (with normals, with colors, with alphas, with uvs)
Function AddSurfaceToOtherSurface(Surface,Mesh,OSurface,OMesh)
SurfaceVerticesCount% = CountVertices(Surface)
;DebugLog("SurfaceVerticesCount = "+SurfaceVerticesCount)
OSurfaceVerticesCount% = CountVertices(OSurface)
;DebugLog("OSurfaceVerticesCount = "+OSurfaceVerticesCount)
For VI% = 0 To CountVertices(Surface)-1 Step 1
;DebugLog("VI = "+VI)
VLX# = VertexX(Surface,VI)
VLY# = VertexY(Surface,VI)
VLZ# = VertexZ(Surface,VI)
TFormPoint(VLX,VLY,VLZ,Mesh,0)
VGX# = TFormedX()
VGY# = TFormedY()
VGZ# = TFormedZ()
VNX# = VertexNX(Surface,VI)
VNY# = VertexNY(Surface,VI)
VNZ# = VertexNZ(Surface,VI)
VR% = VertexRed(Surface,VI)
VG% = VertexGreen(Surface,VI)
VB% = VertexBlue(Surface,VI)
VA# = VertexAlpha(Surface,VI)
VU# = VertexU(Surface,VI,0)
VV# = VertexV(Surface,VI,0)
If( OSurfaceVerticesCount = 0 )
NVI = VI
Else If( OSurfaceVerticesCount > 0 )
NVI% = OSurfaceVerticesCount+VI
EndIf
;DebugLog("NVI = "+NVI)
AddVertex(OSurface,VGX,VGY,VGZ)
VertexNormal(OSurface,NVI,VNX,VNY,VNZ)
VertexColor(OSurface,NVI,VR,VG,VB,VA)
VertexTexCoords(OSurface,NVI,VU,VB)
;WaitKey()
Next
SurfaceTrianglesCount% = CountTriangles(Surface)
;DebugLog("SurfaceTrianglesCount = "+SurfaceTrianglesCount)
OSurfaceTrianglesCount% = CountTriangles(OSurface)
;DebugLog("OSurfaceTrianglesCount = "+OSurfaceTrianglesCount)
For TI% = 0 To CountTriangles(Surface)-1 Step 1
V0I% = TriangleVertex(Surface,TI,0) ;vertex0
V1I% = TriangleVertex(Surface,TI,1) ;vertex1
V2I% = TriangleVertex(Surface,TI,2) ;vertex2
;DebugLog("oldtriangle"+TI+" "+V0I+","+V1I+","+V2I)
If( OSurfaceVerticesCount = 0 )
NV0I% = V0I
NV1I% = V1I
NV2I% = V2I
Else If( OSurfaceVerticesCount > 0 )
NV0I% = OSurfaceVerticesCount+V0I
NV1I% = OSurfaceVerticesCount+V1I
NV2I% = OSurfaceVerticesCount+V2I
EndIf
;DebugLog("newtriangle"+TI+" "+NV0I+","+NV1I+","+NV2I)
AddTriangle(OSurface,NV0I,NV1I,NV2I)
Next
;WaitKey()
End Function
Function ColorSurfaceWithBrush(Surface,R%,G%,B%,A#=1.0,Fx%=0,BlendMode%=1)
Brush = CreateBrush()
BrushColor(Brush,R,G,B)
BrushAlpha(Brush,A)
BrushFX(Brush,Fx)
BrushBlend(Brush,BlendMode)
PaintSurface(Surface,Brush)
FreeBrush(Brush)
End Function |
Comments
| ||
| i suggest to not use Blitz3d primitives because you don't know exactly how they are made/structured. So use your own clean shapes. (i suggest to export with Fragmotion, the export has always been correct for all my shapes so far...) |
Code Archives Forum