namespace gfx::drivers;
#include <OpenGl/gl.h>
+#undef __BLOCKS__
+#include <stdlib.h>
-import "CocoaInterface.h"
+import "CocoaInterface.ec"
+#include "CocoaEcereBridge.h"
import "Display"
import "Window"
class MeshData : struct
{
- int vertices;
- int normals;
- int texCoords;
- int texCoords2;
- int colors;
+ uint vertices;
+ uint normals;
+ uint texCoords;
+ uint texCoords2;
+ uint colors;
};
class IndexData : struct
{
uint16 *indices;
- int buffer;
- int nIndices;
+ uint buffer;
+ uint nIndices;
};
#if !defined(ECERE_NO3D) && !defined(ECERE_VANILLA)
bool result = true;
DisplayData displayData = display.driverData;
- SystemData systemData = display.displaySystem.driverData;
+ //SystemData systemData = display.displaySystem.driverData;
displayData = display.driverData = DisplayData { };
bool result = true;
DisplayData displayData = display.driverData;
- SystemData systemData = display.displaySystem.driverData;
+ //SystemData systemData = display.displaySystem.driverData;
printf("CocoaOpenGLDisplayDriver:DisplaySize(%i,%i) %s:%i\n", width, height, __FILE__, __LINE__);
void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
{
- glDeleteTextures(1, (int *)&bitmap.driverData);
+ uint glBitmap = (uint)(uintptr)bitmap.driverData;
+ glDeleteTextures(1, &glBitmap);
bitmap.driverData = 0;
bitmap.driver = class(LFBDisplayDriver);
{
bool result = false;
Bitmap mipMap { };
- int glBitmap = -1;
+ uint glBitmap = 0;
uint w = pow2i(Min(width, 1024)), h = pow2i(Min(height, 1024));
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, mipMap.picture);
delete mipMap;
- bitmap.driverData = (void *)glBitmap;
+ bitmap.driverData = (void *)(uintptr)glBitmap;
bitmap.driver = displaySystem.driver;
bitmap.width = w;
bitmap.height = h;
{
int c, level;
uint w = pow2i(Min(bitmap.width, 1024)), h = pow2i(Min(bitmap.height, 1024));
- int glBitmap = -1;
+ uint glBitmap = 0;
// Switch ARGB to RGBA
//if(bitmap.format != pixelFormatRGBA)
CocoaGlAssert();
glGenTextures(1, &glBitmap);
CocoaGlAssert();
- if(glBitmap == -1)
+ if(glBitmap == 0)
{
- int error = glGetError();
+ //int error = glGetError();
return false;
//Print("");
}
if(!bitmap.keepData)
bitmap.driver.FreeBitmap(bitmap.displaySystem, bitmap);
- bitmap.driverData = (void *)glBitmap;
+ bitmap.driverData = (void *)(uintptr)glBitmap;
bitmap.driver = displaySystem.driver;
if(!result)
{
float pickX = display.display3D.pickX + surface.offset.x;
float pickY = display.height - (display.display3D.pickY + surface.offset.y) - 1;
- Matrix pickMatrix =
+ Matrix pickMatrix
{
{
w / display.display3D.pickWidth, 0, 0, 0,
}
}
- bool AllocateMesh(DisplaySystem displaySystem, Mesh mesh)
+ bool AllocateMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags, int nVertices)
{
bool result = false;
printf("CocoaOpenGLDisplayDriver: STUB! %s:%i\n", __FILE__, __LINE__);
-
- if(!mesh.data)
- mesh.data = MeshData { };
-
if(mesh.data)
{
- MeshData meshData = mesh.data;
-
- if(mesh.flags.vertices && !meshData.vertices && !mesh.vertices)
- {
- mesh.vertices = mesh.flags.doubleVertices ? (Vector3Df *)new Vector3D[mesh.nVertices] : new Vector3Df[mesh.nVertices];
- if(glGenBuffersARB)
- glGenBuffersARB(1, &meshData.vertices);
- }
- if(mesh.flags.normals && !meshData.normals && !mesh.normals)
- {
- if(glGenBuffersARB)
- glGenBuffersARB( 1, &meshData.normals);
- mesh.normals = mesh.flags.doubleNormals ? (Vector3Df *)new Vector3D[mesh.nVertices] : new Vector3Df[mesh.nVertices];
- }
- if(mesh.flags.texCoords1 && !meshData.texCoords && !mesh.texCoords)
+ OGLMesh oglMesh = mesh.data;
+ if(mesh.nVertices == nVertices)
{
- if(glGenBuffersARB)
- glGenBuffersARB( 1, &meshData.texCoords);
- mesh.texCoords = new Pointf[mesh.nVertices];
+ // Same number of vertices, adding features (Leaves the other features pointers alone)
+ if(mesh.flags != flags)
+ {
+ if(!mesh.flags.vertices && flags.vertices)
+ {
+ if(flags.doubleVertices)
+ {
+ mesh.vertices = (Vector3Df *)new Vector3D[nVertices];
+ }
+ else
+ mesh.vertices = new Vector3Df[nVertices];
+ if(!oglMesh.vertices)
+ GLGenBuffers(1, &oglMesh.vertices);
+ }
+ if(!mesh.flags.normals && flags.normals)
+ {
+ if(flags.doubleNormals)
+ {
+ mesh.normals = (Vector3Df *)new Vector3D[nVertices];
+ }
+ else
+ mesh.normals = new Vector3Df[nVertices];
+ if(!oglMesh.normals)
+ GLGenBuffers( 1, &oglMesh.normals);
+ }
+ if(!mesh.flags.texCoords1 && flags.texCoords1)
+ {
+ mesh.texCoords = new Pointf[nVertices];
+ if(!oglMesh.texCoords)
+ GLGenBuffers( 1, &oglMesh.texCoords);
+ }
+ if(!mesh.flags.colors && flags.colors)
+ {
+ mesh.colors = new ColorRGBAf[nVertices];
+ if(!oglMesh.colors)
+ GLGenBuffers( 1, &oglMesh.colors);
+ }
+ }
}
- if(mesh.flags.colors && !meshData.colors && !mesh.colors)
+ else
{
- if(glGenBuffersARB)
- glGenBuffersARB( 1, &meshData.colors);
- mesh.colors = new ColorRGBAf[mesh.nVertices];
+ // New number of vertices, reallocate all current and new features
+ flags |= mesh.flags;
+ if(flags.vertices)
+ {
+ if(flags.doubleVertices)
+ {
+ mesh.vertices = (Vector3Df *)renew mesh.vertices Vector3D[nVertices];
+ }
+ else
+ mesh.vertices = renew mesh.vertices Vector3Df[nVertices];
+ if(!oglMesh.vertices)
+ GLGenBuffers(1, &oglMesh.vertices);
+ }
+ if(flags.normals)
+ {
+ if(flags.doubleNormals)
+ {
+ mesh.normals = (Vector3Df *)renew mesh.normals Vector3D[nVertices];
+ }
+ else
+ mesh.normals = renew mesh.normals Vector3Df[nVertices];
+ if(!oglMesh.normals)
+ GLGenBuffers( 1, &oglMesh.normals);
+ }
+ if(flags.texCoords1)
+ {
+ mesh.texCoords = renew mesh.texCoords Pointf[nVertices];
+ if(!oglMesh.texCoords)
+ GLGenBuffers( 1, &oglMesh.texCoords);
+ }
+ if(flags.colors)
+ {
+ mesh.colors = renew mesh.colors ColorRGBAf[nVertices];
+ if(!oglMesh.colors)
+ GLGenBuffers( 1, &oglMesh.colors);
+ }
}
result = true;
}
if(mesh)
{
- DisplayData displayData = display.driverData;
- Mesh meshData = mesh.data;
+ //DisplayData displayData = display.driverData;
+ MeshData meshData = mesh.data;
// *** Vertex Stream ***
glEnableClientState(GL_VERTEX_ARRAY);
if(!display.display3D.collectingHits && meshData)
{
if(glBindBufferARB)
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, (long)meshData.vertices);
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, meshData.vertices);
glVertexPointer(3, mesh.flags.doubleVertices ? GL_DOUBLE : GL_FLOAT, 0, glBindBufferARB ? null : mesh.vertices);
// *** Normals Stream ***
{
glEnableClientState(GL_NORMAL_ARRAY);
if(glBindBufferARB)
- glBindBufferARB(GL_ARRAY_BUFFER_ARB, (long)meshData.normals);
+ glBindBufferARB(GL_ARRAY_BUFFER_ARB, meshData.normals);
glNormalPointer(mesh.flags.doubleNormals ? GL_DOUBLE : GL_FLOAT, 0, glBindBufferARB ? null : mesh.normals);
}
else
{
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
if(glBindBufferARB)
- glBindBufferARB( GL_ARRAY_BUFFER_ARB, (long)meshData.texCoords);
+ glBindBufferARB( GL_ARRAY_BUFFER_ARB, meshData.texCoords);
glTexCoordPointer(2, GL_FLOAT, 0, glBindBufferARB ? null : mesh.texCoords);
}
else
{
glEnableClientState(GL_COLOR_ARRAY);
if(glBindBufferARB)
- glBindBufferARB( GL_ARRAY_BUFFER_ARB, (long)meshData.colors);
+ glBindBufferARB( GL_ARRAY_BUFFER_ARB, meshData.colors);
glColorPointer(4, GL_FLOAT, 0, glBindBufferARB ? null : mesh.colors);
}
else
void DrawPrimitives(Display display, PrimitiveSingle * primitive, Mesh mesh)
{
- DisplayData displayData = display.driverData;
+ //DisplayData displayData = display.driverData;
printf("CocoaOpenGLDisplayDriver: STUB! %s:%i\n", __FILE__, __LINE__);
if(primitive->type.vertexRange)