Code: Select all
Procedure ColorBlend(color1.l, color2.l, blend.f)
Protected r.w,g.w,b.w,a.w
r= Red(color1) + (Red(color2) - Red(color1)) * blend
g=Green(color1) + (Green(color2) - Green(color1)) * blend
b= Blue(color1) + (Blue(color2) - Blue(color1)) * blend
a=Alpha(color1) + (Alpha(color2) - Alpha(color1)) * blend
ProcedureReturn RGBA(r,g,b,a)
EndProcedure
ExamineDesktops()
InitEngine3D():InitSprite():InitKeyboard():InitMouse()
ex=DesktopWidth (0)*1
ey=DesktopHeight(0)*1
OpenWindow(0, 0,0, ex,ey, "Test 3d - [F1, F2, F3, F4] - Change sample - [F12] Wireframe - [Esc] quit",#PB_Window_ScreenCentered|#PB_Window_BorderLess)
OpenWindowedScreen(WindowID(0), 0, 0, ex, ey, 0, 0, 0)
Add3DArchive(#PB_Compiler_Home + "examples/3d/Data/Textures",#PB_3DArchive_FileSystem)
Parse3DScripts()
CreateCamera(0, 0, 0, 100, 100):MoveCamera(0,0,0,-18):CameraLookAt(0,0,0,0)
CreateLight(0,$ffffff, 10000, 10000, 0000):SetLightColor(0,#PB_Light_SpecularColor,$ffffff)
AmbientColor($777777)
vert_pg.s="%%%#version 130%%uniform mat4 worldviewproj_matrix;//+24%uniform vec4 camera_pos_os;//+77%uniform vec4 light_pos_os;//+44 0%uniform vec4 light_att;//+41 0%uniform vec4 fog_params;//+31%%varying vec3 oviewdir;%varying vec3 olightdir;%varying vec3 onormal;%varying vec4 ovcolor;%varying float olightatt;%varying vec2 ouv;%%void main()%{%oviewdir=normalize(camera_pos_os.xyz-gl_Vertex.xyz);%olightdir=normalize(light_pos_os.xyz-gl_Vertex.xyz);%gl_Position=worldviewproj_matrix*gl_Vertex;%onormal=gl_Normal;%float Dist=distance(light_pos_os,gl_Vertex);%olightatt=1.0/(light_att.y+light_att.z*Dist+light_att.w*Dist*Dist);%ouv=(gl_TextureMatrix[0]*gl_MultiTexCoord0).xy;%ovcolor=gl_Color;%}%%%%"
frag_pg.s="%%%#version 130%%uniform vec4 diffuse_ml;//+69 0%uniform vec4 specular_ml;//+70 0%uniform vec4 ambient_ml;//+67 0%uniform float shininess;//+36%uniform float blend;//0.5%%uniform sampler2D tx1;//0%uniform sampler2D tx2;//1%%varying vec3 oviewdir;%varying vec3 olightdir;%varying vec3 onormal;%varying vec4 ovcolor;%varying float olightatt;%varying vec2 ouv;%%void main()%{%vec3 normal=normalize(onormal);if (gl_FrontFacing==false) normal*=-1;%vec3 viewdir=normalize(oviewdir);%vec3 lightdir=normalize(olightdir);%%vec4 tcolor=vec4(mix(texture(tx1,ouv),texture(tx2,ouv),blend))*ovcolor;%%float dif=max(dot(lightdir,normal),0)*olightatt;%float spe=pow(max(dot(normalize(lightdir+viewdir),normal),0),shininess);%gl_FragColor=vec4(tcolor.rgb,1)*(ambient_ml+diffuse_ml*dif)+specular_ml*tcolor.a*spe;%}%%%"
CreateShader(0,vert_pg,frag_pg)
LoadTexture(0, "Dirt.jpg")
LoadTexture(1, "soil_wall.jpg")
LoadTexture(2, "MRAMOR6X6.jpg")
LoadTexture(3, "Wood.jpg")
LoadTexture(4, "DosCarte.png")
LoadTexture(5, "RustySteel.jpg")
Procedure material(n,tx,scale,culling,tx0=0,tx1=0)
CreateShaderMaterial(n,0):MaterialShaderTexture(n,TextureID(tx0),TextureID(tx1),0,0)
MaterialShininess(n,256,$ffffff)
If culling:MaterialCullingMode(n,#PB_Material_AntiClockWiseCull):EndIf
MaterialFilteringMode(n,#PB_Material_Anisotropic,4)
ScaleMaterial(n,1/scale,1/scale)
EndProcedure
Structure PB_MeshVertexV
p.vector3
n.vector3
t.vector3
u.f
v.f
color.l
EndStructure
Procedure Mix3D(*R.Vector3, *V1.Vector3, *V2.Vector3, r.f)
*R\x = *V1\x + r * (*V2\x - *V1\x)
*R\y = *V1\y + r * (*V2\y - *V1\y)
*R\z = *V1\z + r * (*V2\z - *V1\z)
EndProcedure
Global n=64,n2=n/2
Global Dim p0.vector3(n,n)
Global Dim p1.vector3(n,n)
Global Dim t.PB_MeshVertexv(n,n)
For j=0 To n
For i=0 To n
With t(i,j)
\u=i/n
\v=j/n
\color=$ffffffff
EndWith
Next
Next
Procedure mesh_morph(r.f)
For j=0 To n
For i=0 To n
Mix3D(t(i,j)\p,p0(i,j),p1(i,j) ,r)
Next
Next
CreateDataMesh(0,t(),8+2)
CreateEntity(0,MeshID(0),MaterialID(0),0,0,0)
CreateEntity(1,MeshID(0),MaterialID(1),0,0,0)
EndProcedure
Procedure geometrie(Array p.vector3(2),num,a.f,b.f,c.f,m=0)
Protected.f u,v
For j=0 To n
For i=0 To n
With p(i,j)
u=(j-n2*m)/n*2*#PI
v=(i-n2*m)/n*2*#PI
Select num
Case 0; double torre
\x=(a+b*(Cos(u)*Sin(v/2)-Sin(u)*Sin(v)))*Cos(u*2)
\y=(a+b*(Cos(u)*Sin(v/2)-Sin(u)*Sin(v)))*Sin(u*2)
\z=-b*4*(Sin(u)*Sin(v/2)+Cos(u)*Sin(v))
Case 1; sphere
u/2
\x=a*Sin(u)*Cos(v)
\y=b*Sin(u)*Sin(v)
\z=c*Cos(u)
Case 2; coquille
u*4
\x=(a+b*Cos(v))*Exp(c*u)*Cos(u)
\y=(a+b*Cos(v))*Exp(c*u)*Sin(u)
\z=(3*a+b*Sin(v))*Exp(c*u)-5
Case 3; coussin
u/2
\x=a*Sin(u)
\y=b*Sin(v)
\z=c*Cos(u)*Cos(v)/Sqr(2)
Case 4; tetraedre
\x=a*Cos(u)
\y=b*Cos(v)
\z=-c*Cos(u+v)
Case 5; fleur
\x=u*Cos(v)
\y=u*Sin(v)
\z=a*Cos(b*v)
Case 6; dé creux
\x=a*Sin(u)
\y=a*Sin(v)
\z=a*Sin(u+v)
Case 7; truc
\x=a*(u/(1+u*u+v*v))
\y=b*(v/(1+u*u+v*v))
\z=-c*(u*v/(1+u*u+v*v))
Case 8; goutte
u/2
\x=b/2*a*Sin(u)*Cos(v)
\y=b/2*a*Sin(u)*Sin(v)
\z=8-a*4*Sin(u/2)
Case 9; octaedre
v/2
\x=a*Pow(Cos(v),b)*Pow(Cos(u),c)
\y=a*Pow(Cos(v),b)*Pow(Sin(u),c)
\z=a*Pow(Sin(v),b)
Case 10; berlingo
u/#PI
\x=b*a*(1+u)*Cos(v)
\y=b*a*(1-u)*Sin(v)
\z=-a*u
Case 11 ;tri truc
u/(2*#PI)
b=3*Cos(u)/(Sqr(2)-a*Sin(2*u)*Sin(3*v))
\x=b*(Cos(u)*Cos(2*v)+Sqr(2)*Sin(u)*Cos(v))
\y=b*(Cos(u)*Sin(2*v)-Sqr(2)*Sin(u)*Sin(v))
\z=-b*3*Cos(u)+8
EndSelect
EndWith
Next
Next
EndProcedure
Procedure sample(Array p.vector3(2),num)
;num=1;If Random(1):num=12:Else:num=2:EndIf
Select num
Case 0:geometrie(p(),0,4,1,0,0)
Case 1:geometrie(p(),1,8,6,3,0)
Case 2:geometrie(p(),2,3,4,-0.1,0)
Case 3:geometrie(p(),3,6,6,4,1)
Case 4:geometrie(p(),4,4,4,5,1)
Case 5:geometrie(p(),5,1,7,0,0)
Case 6:geometrie(p(),6,4,0,0,0)
Case 7:geometrie(p(),7,10,10,10,1)
Case 8:geometrie(p(),8,3,4,0,0)
Case 9:geometrie(p(),9,8,3,3,1)
Case 10:geometrie(p(),10,6,0.5,0,1)
Case 11:geometrie(p(),11,1,0,0,0)
Case 12:geometrie(p(),2,4,3,-0.15,0)
Case 13:geometrie(p(),5,2,3,0,0)
Case 14:geometrie(p(),9,7,3,1,1)
Case 15:geometrie(p(),9,6,1,3,1)
EndSelect
EndProcedure
Define cpt,co0,co1,co,cf,cf0,cf1,tx0,tx1, dt_trans=60*4:dt_tot=60*6
Define.f rx,ry,rz,trans, ev, Quit = #False
Repeat
Repeat
ev = WindowEvent()
If ev = #PB_Event_CloseWindow : Quit = #True : EndIf
Until ev = 0
If cpt=0
CopyArray(p1(),p0()):sample(p1(),Random(15))
co0=co1:co1=RGB(Random(127),Random(127),Random(127))
cf0=cf1:cf1=RGB(Random(255),Random(255),Random(255))
tx0=tx1:tx1=Random(5)
material(0,0,4,0,tx0,tx1)
material(1,1,4,1,tx0,tx1)
EndIf
If cpt<=dt_trans
trans=(1-Cos(cpt/dt_trans*#PI))/2
mesh_morph(trans)
MaterialShaderParameter(0,1,"blend",#PB_Shader_Float,trans,0,0,0)
MaterialShaderParameter(1,1,"blend",#PB_Shader_Float,trans,0,0,0)
co=ColorBlend(co0,co1,trans)
SetMaterialColor(0,#PB_Material_AmbientColor|#PB_Material_DiffuseColor,$808080+co)
SetMaterialColor(1,#PB_Material_AmbientColor|#PB_Material_DiffuseColor,$ffffff-co)
cf=ColorBlend(cf0,cf1,trans)
CameraBackColor(0,cf)
EndIf
ExamineMouse()
ExamineKeyboard()
If KeyboardReleased(#PB_Key_F12):fdf=1-fdf:If fdf:CameraRenderMode(0,#PB_Camera_Wireframe):Else:CameraRenderMode(0,#PB_Camera_Textured):EndIf:EndIf
If KeyboardPushed(#PB_Key_Space)=0:cpt=(cpt+1)%dt_tot:EndIf
rx+0.8:ry+0.5:rz+0.6
RotateEntity(0,rx,ry,rz,0)
RotateEntity(1,rx,ry,rz,0)
RenderWorld()
FlipBuffers()
Until Quit = #True Or KeyboardReleased(#PB_Key_Escape) Or MouseButton(3)
(Edit: Not great after all. It does work but it froze on third trial run)
On windows it works without a hitch.