Back to Content
Creating 3D geometry using JavaScript - Tutorial
You can generate new geometry from scratch in Coppercube, using scripting. This is possible not only in the editor, but also in the Windows .exe and Mac OS X .app target, during runtime, and can be very useful. It is actually very easy and this short tutorial shows how:
The resulting generated geometry
It works like this: For every geometry in CopperCube you have two buffers: one which holds the vertices with position, color, etc. And another buffer which holds indices to those vertices. So if you have for example 4 vertices:
0-----1
| |
| |
2-----3
Then for creating a rectangle, you would need to make two triangles out of this:
0-----1
| / |
| / |
2-----3
So, in the index buffer, you will need to store the two triangles, 0-1-2 and 1-3-2. So the index buffer will look like this;:
(0,1,2,1,3,2)
For adding a vertex to the vertex buffer, there is the function ccbAddMeshBufferVertex() and for adding an index, use the function ccbAddMeshBufferIndex().
As example code, we let the user select a 3D object in the editor, and replace all of its geometry with a rectangle:
// use the currently selected node in the editor
var meshnode = editorGetSelectedSceneNode();
var bufferCount = ccbGetSceneNodeMeshBufferCount(meshnode);
if (bufferCount == 0)
alert('The selected node has no 3D geometry.');
else
{
// get old texture of that node
var oldTexture = ccbGetSceneNodeMaterialProperty(meshnode, 0, "Texture1");
// remove all mesh buffers holding geometry, because we want to replace its geometry with a totally new one
for (var i=0; i<bufferCount; ++i)
ccbRemoveMeshBuffer(meshnode, 0);
// add new buffer
ccbAddMeshBuffer(meshnode);
// disable dynamic lighting and set a texture
ccbSetSceneNodeMaterialProperty(meshnode, 0, 'Lighting', false);
ccbSetSceneNodeMaterialProperty(meshnode, 0, "Texture1", oldTexture);
// add 4 vertices
ccbAddMeshBufferVertex(meshnode, 0, new vector3d(0,10,0));
ccbAddMeshBufferVertex(meshnode, 0, new vector3d(10,10,0));
ccbAddMeshBufferVertex(meshnode, 0, new vector3d(0,0,0));
ccbAddMeshBufferVertex(meshnode, 0, new vector3d(10,0,0));
// set their colors
ccbSetMeshBufferVertexColor(meshnode, 0, 0, 0x77400000);
ccbSetMeshBufferVertexColor(meshnode, 0, 1, 0x77400000);
ccbSetMeshBufferVertexColor(meshnode, 0, 2, 0x77400000);
ccbSetMeshBufferVertexColor(meshnode, 0, 3, 0x77400000);
// set texture coordinate
ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 0, new vector3d(0,1,0));
ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 1, new vector3d(1,1,0));
ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 2, new vector3d(0,0,0));
ccbSetMeshBufferVertexTextureCoord(meshnode, 0, 3, new vector3d(1,0,0));
// add 6 indices, to create 2 triangles from this.
// note that the order is important. If you are adding the indices
// 0,1,2, you create a triangle facing into forward direction,
// if you add it with 0,2,1, it will face into the opposite direction.
ccbAddMeshBufferIndex(meshnode, 0, 0);
ccbAddMeshBufferIndex(meshnode, 0, 1);
ccbAddMeshBufferIndex(meshnode, 0, 2);
ccbAddMeshBufferIndex(meshnode, 0, 1);
ccbAddMeshBufferIndex(meshnode, 0, 3);
ccbAddMeshBufferIndex(meshnode, 0, 2);
// update the bounding box of the node
ccbUpdateSceneNodeBoundingBox(meshnode);
}
For trying this, just open the scripting window (View -> Scripting Window), clear all the text in it, paste this text into there, and click 'execute'. Be sure to select a 3d object before.