Sample Object Plugin Code

This PureBasic example show how plugins can be written to add new primitives to Cartography Shop.

 

IncludeFile "memfunctions.pb"
IncludeFile "meshfunctions.pb"

;Tell CShop this is an object plugin
ProcedureDLL PLUGINCLASS(*inbuffer,insize,*outbuffer,outsize)
PokeL(*outbuffer,1)
EndProcedure

;Object category and name
ProcedureDLL PLUGINNAME(*inbuffer,insize,*outbuffer,outsize)
writemem(*outbuffer)
writes("Primitives\Cylinder")
EndProcedure

;Use bounding box to draw this object
ProcedureDLL CREATIONMETHOD(*inbuffer,insize,*outbuffer,outsize)
writemem(*outbuffer)
writel(0)
EndProcedure

;Optional parameters to appear in the side panel
ProcedureDLL PLUGINPARAMETERS(*inbuffer,insize,*outbuffer,outsize)
writemem(*outbuffer)
writeb(2);number of parameters
writes("Sides")
writeb(2);Spinner gadget
writel(3);Minimum value
writel(32);Maximum value
writel(16);Default value
writes("End caps")
writeb(1);Checkbox gadget
writeb(1);Default value
EndProcedure

ProcedureDLL BUFFERSIZE(*inbuffer,insize,*outbuffer,outsize)
readmem(*inbuffer)

;Position and scale of bounding box:
x.f=
readf()
y.f=
readf()
z.f=
readf()
w.f=
readf()
h.f=
readf()
d.f=
readf()
prop1=
readl()
prop2=
readl()
prop3=
readl()
prop4=
readl()
prop5=
readl()

writemem(*outbuffer)
writel(10000);buffer size this plugin requires
EndProcedure

ProcedureDLL CREATEOBJECT(*inbuffer,insize,*outbuffer,outsize)
readmem(*inbuffer)
sx.f=
readf()
sy.f=
readf()
sz.f=
readf()
w.f=
readf()
h.f=
readf()
d.f=
readf()
sides=
readl()
endcaps=
readl()
smooth=
readl()
prop4=
readl()
prop5=
readl()

w=w/2.0
h=h/2.0
d=d/2.0

writemem(*outbuffer)

writel(4);version

writel(0);number of groups
writel(0);number of lightmaps
writel(1);number of meshes

faces=sides
If endcaps=1
  faces=faces+2
 
EndIf

startmesh(x,y,z,faces)

;End caps
If endcaps=1
 
;Face 1 - Top
 
startsurface(sides,sides-2)
   
For n=0 To sides-1
      side.f=n
      sidesf.f=sides
      a.f=(side.f/sidesf.f)*2.0*3.14159265
;PureBasic uses radians for trig functions
      x=
Cos(a.f)*w
      z=
Sin(a.f)*d
     
addvertex(x+sx,h+sy,z+sz)
     
Next
   
For n=2 To sides-1
     
addtriangle(0,n,n-1)
     
Next
 
;Face 2 - Bottom
 
startsurface(sides,sides-2)
   
For n=0 To sides-1
      side.f=n
      sidesf.f=sides
      a.f=(side.f/sidesf.f)*2.0*3.14159265
      x=
Cos(a.f)*w
      z=
Sin(a.f)*d
     
addvertex(x+sx,-h+sy,z+sz)
     
Next
   
For n=2 To sides-1
     
addtriangle(n,0,n-1)
     
Next
 
EndIf

For n=0 To sides-1
 
startsurface(4,2)
  side.f=n
  sidesf.f=sides
  a.f=(side.f/sidesf.f)*2.0*3.14159265
  x=
Cos(a.f)*w
  z=
Sin(a.f)*d
 
addvertex(x+sx,-h+sy,z+sz)
 
addvertex(x+sx,h+sy,z+sz)
  side.f=n+1
  a.f=(side.f/sidesf.f)*2.0*3.14159265
  x=
Cos(a.f)*w
  z=
Sin(a.f)*d
 
addvertex(x+sx,-h+sy,z+sz)
 
addvertex(x+sx,h+sy,z+sz)
 
addtriangle(0,1,2)
 
addtriangle(3,2,1)
 
Next

writel(0);number of entities
writef(0);x
writef(0);y
writef(0);z
writef(0);pitch
writef(0);yaw

EndProcedure

 

 

You may find these two files useful as well:

 

;Memfunctions.pb


Global *currentreadbuffer
Global *currentwritebuffer

Procedure ReadMem(*buffer)
*currentreadbuffer=*buffer
EndProcedure

Procedure WriteMem(*buffer)
*currentwritebuffer=*buffer
EndProcedure

Procedure WriteL(value.l)
PokeL(*currentwritebuffer,value.l)
*currentwritebuffer=*currentwritebuffer+4
EndProcedure

Procedure WriteF(value.f)
PokeF(*currentwritebuffer,value.f)
*currentwritebuffer=*currentwritebuffer+4
EndProcedure

Procedure WriteB(value.b)
PokeB(*currentwritebuffer,value.b)
*currentwritebuffer=*currentwritebuffer+1
EndProcedure

Procedure WriteS(value.s)
PokeS(*currentwritebuffer,value.s)
*currentwritebuffer=*currentwritebuffer+
Len(value.s)+1
EndProcedure

Procedure.l ReadL()
value.l=
PeekL(*currentreadbuffer)
*currentreadbuffer=*currentreadbuffer+4
ProcedureReturn value
EndProcedure

Procedure.f ReadF()
value.f=
PeekF(*currentreadbuffer)
*currentreadbuffer=*currentreadbuffer+4
ProcedureReturn value
EndProcedure

Procedure.b ReadB()
value.b=
PeekB(*currentreadbuffer)
*currentreadbuffer=*currentreadbuffer+1
ProcedureReturn value
EndProcedure

Procedure.s ReadS()
value.s=
PeekS(*currentreadbuffer)
*currentreadbuffer=*currentreadbuffer+
Len(value.s)+1
ProcedureReturn value
EndProcedure

 

 

;Meshfunctions.pb


Procedure StartMesh(x.f,y.f,z.f,faces)
writel(216);flags
writel(0);group
writes("");properties
writel(255);red
writel(255);green
writel(255);blue
writef(x);xposition
writef(y);yposition
writef(z);zposition
writel(faces);faces
EndProcedure

Procedure StartSurface(verts,tris)
writel(0);flags
writes("");material
writel(0);lightmap
writef(0);offsetu
writef(0);offsetv
writef(1);scaleu
writef(1);scalev
writef(0);rotation
writel(verts);vertices
writel(tris);triangles
writel(0);lines
EndProcedure

Procedure AddVertex(x.f,y.f,z.f)
writef(x);xposition
writef(y);yposition
writef(z);zposition
writef(nx);normalx
writef(ny);normaly
writef(nz);normalz 
writel(255);red
writel(255);green
writel(255);blue
writef(0);u0
writef(0);v0
writef(0);w0
writef(0);u1
writef(0);v1
writef(0);w1
EndProcedure

Procedure AddTriangle(a,b,c)
writel(a)
writel(b)
writel(c)
EndProcedure