THE POST BELOW IS MORE THAN 5 YEARS OLD. RELATED SUPPORT INFORMATION MIGHT BE OUTDATED OR DEPRECATED
On 29/11/2010 at 12:12, xxxxxxxx wrote:
Not much I can do to simply the project. It is ready-for-release and everything is very much interdependent (except for maybe the plugin tag which isn't where the problem resides). It is still in Greebler.LoadStockLibrary() and the method that it calls for each shape object. The code is supplied below. Note that every single solitary memory allocation is checked and there are no error messages (I'm now also opening a MessageDialog() - still silent crash!). Also note that there are no problems, issues, or crashes whatsoever in Cinema 4D using this code.
// Greebler.LoadStockLibrary
//*---------------------------------------------------------------------------*
Bool Greebler::LoadStockLibrary()
//*---------------------------------------------------------------------------*
{
// Create Stock Shape Objects programmatically (because of C4D NET Client)
if (!CreateStockObject("Cube", Cube_Extrude, Cube_ExtrudeCap, Cube_Bevel, Cube_BevelCap)) return FALSE;
if (!CreateStockObject("T", T_Extrude, T_ExtrudeCap, T_Bevel, T_BevelCap)) return FALSE;
if (!CreateStockObject("L", L_Extrude, L_ExtrudeCap, L_Bevel, L_BevelCap)) return FALSE;
if (!CreateStockObject("C", C_Extrude, C_ExtrudeCap, C_Bevel, C_BevelCap)) return FALSE;
if (!CreateStockObject("H", H_Extrude, H_ExtrudeCap, H_Bevel, H_BevelCap)) return FALSE;
if (!CreateStockObject("D", D_Extrude, D_ExtrudeCap, D_Bevel, D_BevelCap)) return FALSE;
if (!CreateStockObject("Box", Box_Extrude, Box_ExtrudeCap, Box_Bevel, Box_BevelCap)) return FALSE;
if (!CreateStockObject("CubeCC", CubeCC_Extrude, CubeCC_ExtrudeCap, CubeCC_Bevel, CubeCC_BevelCap)) return FALSE;
if (!CreateStockObject("OblongOctagon", OblOct_Extrude, OblOct_ExtrudeCap, OblOct_Bevel, OblOct_BevelCap)) return FALSE;
return TRUE;
}
// Greebler.CreateStockObject
//*---------------------------------------------------------------------------*
Bool Greebler::CreateStockObject(const String& name, StockShapeDefs ssd_extrude, StockShapeDefs ssd_extcap, StockShapeDefs ssd_bevel, StockShapeDefs ssd_bevcap)
//*---------------------------------------------------------------------------*
{
// Create All Shape objects and tags
AutoAlloc<PolygonObject> extrude(ssd_extrude.numPoints, ssd_extrude.numPolygons);
if (!extrude) return ErrPrt("Greebler.Greebler.CreateStockObject.extrude");
extrude->SetName("Extrude");
AutoAlloc<PolygonObject> extcap(ssd_extcap.numPoints, ssd_extcap.numPolygons);
if (!extcap) return ErrPrt("Greebler.Greebler.CreateStockObject.extcap");
extcap->SetName("ExtrudeCap");
AutoAlloc<PolygonObject> bevel(ssd_bevel.numPoints, ssd_bevel.numPolygons);
if (!bevel) return ErrPrt("Greebler.Greebler.CreateStockObject.bevel");
bevel->SetName("Bevel");
AutoAlloc<PolygonObject> bevcap(ssd_bevcap.numPoints, ssd_bevcap.numPolygons);
if (!bevcap) return ErrPrt("Greebler.Greebler.CreateStockObject.bevcap");
bevcap->SetName("BevelCap");
AutoAlloc<BaseObject> nop(Onull);
if (!nop) return ErrPrt("Greebler.Greebler.CreateStockObject.nop");
nop->SetName(name);
// - PolygonSelection and PointSelection tags
// -- Extrude
AutoAlloc<SelectionTag> ext_po_top(Tpolygonselection);
if (!ext_po_top) return ErrPrt("Greebler.Greebler.CreateStockObject.ext_po_top");
ext_po_top->SetName("Top");
AutoAlloc<SelectionTag> ext_po_sides(Tpolygonselection);
if (!ext_po_sides) return ErrPrt("Greebler.Greebler.CreateStockObject.ext_po_sides");
ext_po_sides->SetName("Sides");
AutoAlloc<SelectionTag> ext_pt_top(Tpointselection);
if (!ext_pt_top) return ErrPrt("Greebler.Greebler.CreateStockObject.ext_pt_top");
ext_pt_top->SetName("Top");
// -- ExtrudeCap
AutoAlloc<SelectionTag> extc_po_top(Tpolygonselection);
if (!extc_po_top) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_po_top");
extc_po_top->SetName("Top");
AutoAlloc<SelectionTag> extc_po_sides(Tpolygonselection);
if (!extc_po_sides) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_po_sides");
extc_po_sides->SetName("Sides");
AutoAlloc<SelectionTag> extc_po_cap(Tpolygonselection);
if (!extc_po_cap) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_po_cap");
extc_po_cap->SetName("Cap");
AutoAlloc<SelectionTag> extc_pt_top(Tpointselection);
if (!extc_pt_top) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_pt_top");
extc_pt_top->SetName("Top");
// -- Bevel
AutoAlloc<SelectionTag> bev_po_top(Tpolygonselection);
if (!bev_po_top) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_po_top");
bev_po_top->SetName("Top");
AutoAlloc<SelectionTag> bev_po_sides(Tpolygonselection);
if (!bev_po_sides) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_po_sides");
bev_po_sides->SetName("Sides");
AutoAlloc<SelectionTag> bev_po_bevel(Tpolygonselection);
if (!bev_po_bevel) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_po_bevel");
bev_po_bevel->SetName("Bevel");
AutoAlloc<SelectionTag> bev_pt_top(Tpointselection);
if (!bev_pt_top) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_pt_top");
bev_pt_top->SetName("Top");
AutoAlloc<SelectionTag> bev_pt_sides(Tpointselection);
if (!bev_pt_sides) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_pt_sides");
bev_pt_sides->SetName("Sides");
// -- BevelCap
AutoAlloc<SelectionTag> bevc_po_top(Tpolygonselection);
if (!bevc_po_top) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_top");
bevc_po_top->SetName("Top");
AutoAlloc<SelectionTag> bevc_po_sides(Tpolygonselection);
if (!bevc_po_sides) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_sides");
bevc_po_sides->SetName("Sides");
AutoAlloc<SelectionTag> bevc_po_cap(Tpolygonselection);
if (!bevc_po_cap) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_cap");
bevc_po_cap->SetName("Cap");
AutoAlloc<SelectionTag> bevc_po_bevel(Tpolygonselection);
if (!bevc_po_bevel) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_bevel");
bevc_po_bevel->SetName("Bevel");
AutoAlloc<SelectionTag> bevc_pt_top(Tpointselection);
if (!bevc_pt_top) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_pt_top");
bevc_pt_top->SetName("Top");
AutoAlloc<SelectionTag> bevc_pt_sides(Tpointselection);
if (!bevc_pt_sides) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_pt_sides");
bevc_pt_sides->SetName("Sides");
// Set up Points and Polygons
// - Extrude
LONG i;
Vector* points = extrude->GetPointW();
if (!points) return ErrPrt("Greebler.Greebler.CreateStockObject.extrude->GetPointW");
CPolygon* polys = extrude->GetPolygonW();
if (!polys) return ErrPrt("Greebler.Greebler.CreateStockObject.extrude->GetPolygonW");
CopyMem(ssd_extrude.points, points, sizeof(Vector)*ssd_extrude.numPoints);
for (i = 0L; i != ssd_extrude.numPolygons; ++i)
{
polys[i].a = ssd_extrude.polygons[i][0];
polys[i].b = ssd_extrude.polygons[i][1];
polys[i].c = ssd_extrude.polygons[i][2];
polys[i].d = ssd_extrude.polygons[i][3];
}
// - Create UVWTag and set it up.
if (!CreateUVs(extrude, polys, points, NULL, ssd_extrude.numPolygons, ssd_extrude.numPoints)) return ErrPrt("Greebler.Greebler.CreateStockObject.CreateUVs(extrude)");
// - Extrude Cap
points = extcap->GetPointW();
if (!points) return ErrPrt("Greebler.Greebler.CreateStockObject.extcap->GetPointW");
polys = extcap->GetPolygonW();
if (!polys) return ErrPrt("Greebler.Greebler.CreateStockObject.extcap->GetPolygonW");
CopyMem(ssd_extcap.points, points, sizeof(Vector)*ssd_extcap.numPoints);
for (i = 0L; i != ssd_extcap.numPolygons; ++i)
{
polys[i].a = ssd_extcap.polygons[i][0];
polys[i].b = ssd_extcap.polygons[i][1];
polys[i].c = ssd_extcap.polygons[i][2];
polys[i].d = ssd_extcap.polygons[i][3];
}
// - Create UVWTag and set it up.
if (!CreateUVs(extcap, polys, points, NULL, ssd_extcap.numPolygons, ssd_extcap.numPoints)) return ErrPrt("Greebler.Greebler.CreateStockObject.CreateUVs(extcap)");
// - Bevel
points = bevel->GetPointW();
if (!points) return ErrPrt("Greebler.Greebler.CreateStockObject.bevel->GetPointW");
polys = bevel->GetPolygonW();
if (!polys) return ErrPrt("Greebler.Greebler.CreateStockObject.bevel->GetPolygonW");
CopyMem(ssd_bevel.points, points, sizeof(Vector)*ssd_bevel.numPoints);
for (i = 0L; i != ssd_bevel.numPolygons; ++i)
{
polys[i].a = ssd_bevel.polygons[i][0];
polys[i].b = ssd_bevel.polygons[i][1];
polys[i].c = ssd_bevel.polygons[i][2];
polys[i].d = ssd_bevel.polygons[i][3];
}
// - Create UVWTag and set it up.
if (!CreateUVs(bevel, polys, points, NULL, ssd_bevel.numPolygons, ssd_bevel.numPoints)) return ErrPrt("Greebler.Greebler.CreateStockObject.CreateUVs(bevel)");
// - Bevel Cap
points = bevcap->GetPointW();
if (!points) return ErrPrt("Greebler.Greebler.CreateStockObject.bevcap->GetPointW");
polys = bevcap->GetPolygonW();
if (!polys) return ErrPrt("Greebler.Greebler.CreateStockObject.bevcap->GetPolygonW");
CopyMem(ssd_bevcap.points, points, sizeof(Vector)*ssd_bevcap.numPoints);
for (i = 0L; i != ssd_bevcap.numPolygons; ++i)
{
polys[i].a = ssd_bevcap.polygons[i][0];
polys[i].b = ssd_bevcap.polygons[i][1];
polys[i].c = ssd_bevcap.polygons[i][2];
polys[i].d = ssd_bevcap.polygons[i][3];
}
// - Create UVWTag and set it up.
if (!CreateUVs(bevcap, polys, points, NULL, ssd_bevcap.numPolygons, ssd_bevcap.numPoints)) return ErrPrt("Greebler.Greebler.CreateStockObject.CreateUVs(bevcap)");
// Set up PolygonSelections and PointSelections
// - Extrude
BaseSelect* bs = ext_po_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.ext_po_top->GetBaseSelect");
bs->FromArray(&(ssd_extrude.posel_top)[0], ssd_extrude.numPolygons);
bs = ext_po_sides->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.ext_po_sides->GetBaseSelect");
bs->FromArray(&(ssd_extrude.posel_sides)[0], ssd_extrude.numPolygons);
bs = ext_pt_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.ext_pt_top->GetBaseSelect");
bs->FromArray(&(ssd_extrude.ptsel_top)[0], ssd_extrude.numPoints);
// - Extrude Cap
bs = extc_po_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_po_top->GetBaseSelect");
bs->FromArray(&(ssd_extcap.posel_top)[0], ssd_extcap.numPolygons);
bs = extc_po_sides->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_po_sides->GetBaseSelect");
bs->FromArray(&(ssd_extcap.posel_sides)[0], ssd_extcap.numPolygons);
bs = extc_po_cap->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_po_cap->GetBaseSelect");
bs->FromArray(&(ssd_extcap.posel_cap)[0], ssd_extcap.numPolygons);
bs = extc_pt_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.extc_pt_top->GetBaseSelect");
bs->FromArray(&(ssd_extcap.ptsel_top)[0], ssd_extcap.numPoints);
// - Bevel
bs = bev_po_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_po_top->GetBaseSelect");
bs->FromArray(&(ssd_bevel.posel_top)[0], ssd_bevel.numPolygons);
bs = bev_po_sides->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_po_sides->GetBaseSelect");
bs->FromArray(&(ssd_bevel.posel_sides)[0], ssd_bevel.numPolygons);
bs = bev_po_bevel->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_po_bevel->GetBaseSelect");
bs->FromArray(&(ssd_bevel.posel_bevel)[0], ssd_bevel.numPolygons);
bs = bev_pt_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_pt_top->GetBaseSelect");
bs->FromArray(&(ssd_bevel.ptsel_top)[0], ssd_bevel.numPoints);
bs = bev_pt_sides->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bev_pt_sides->GetBaseSelect");
bs->FromArray(&(ssd_bevel.ptsel_sides)[0], ssd_bevel.numPoints);
// - Bevel Cap
bs = bevc_po_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_top->GetBaseSelect");
bs->FromArray(&(ssd_bevcap.posel_top)[0], ssd_bevcap.numPolygons);
bs = bevc_po_sides->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_sides->GetBaseSelect");
bs->FromArray(&(ssd_bevcap.posel_sides)[0], ssd_bevcap.numPolygons);
bs = bevc_po_bevel->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_bevel->GetBaseSelect");
bs->FromArray(&(ssd_bevcap.posel_bevel)[0], ssd_bevcap.numPolygons);
bs = bevc_po_cap->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_po_cap->GetBaseSelect");
bs->FromArray(&(ssd_bevcap.posel_cap)[0], ssd_bevcap.numPolygons);
bs = bevc_pt_top->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_pt_top->GetBaseSelect");
bs->FromArray(&(ssd_bevcap.ptsel_top)[0], ssd_bevcap.numPoints);
bs = bevc_pt_sides->GetBaseSelect();
if (!bs) return ErrPrt("Greebler.Greebler.CreateStockObject.bevc_pt_sides->GetBaseSelect");
bs->FromArray(&(ssd_bevcap.ptsel_sides)[0], ssd_bevcap.numPoints);
// Release all from AutoAlloc
// - put tags on objects
extrude->InsertTag(ext_pt_top.Release());
extrude->InsertTag(ext_po_sides.Release());
extrude->InsertTag(ext_po_top.Release());
extcap->InsertTag(extc_pt_top.Release());
extcap->InsertTag(extc_po_cap.Release());
extcap->InsertTag(extc_po_sides.Release());
extcap->InsertTag(extc_po_top.Release());
bevel->InsertTag(bev_pt_sides.Release());
bevel->InsertTag(bev_pt_top.Release());
bevel->InsertTag(bev_po_bevel.Release());
bevel->InsertTag(bev_po_sides.Release());
bevel->InsertTag(bev_po_top.Release());
bevcap->InsertTag(bevc_pt_sides.Release());
bevcap->InsertTag(bevc_pt_top.Release());
bevcap->InsertTag(bevc_po_bevel.Release());
bevcap->InsertTag(bevc_po_cap.Release());
bevcap->InsertTag(bevc_po_sides.Release());
bevcap->InsertTag(bevc_po_top.Release());
// - put objects under Null object
bevcap->InsertUnderLast(nop);
bevel->InsertUnderLast(nop);
extcap->InsertUnderLast(nop);
extrude->InsertUnderLast(nop);
bevcap.Release();
bevel.Release();
extcap.Release();
extrude.Release();
// - and Append Null to AtomArray
if (!array_stock->Append(nop.Release())) return ErrPrt("Greebler.Greebler.CreateStockObject.array_stock.Append()");
return TRUE;
}
And the header with the static shape object definitions (partial) :
////////////////////////////////////////////////////////////////
// StockShapeDefs.h
////////////////////////////////////////////////////////////////
// Greebler Stock Shape Geometry definitions
////////////////////////////////////////////////////////////////
// V1.0.0 2010.11.26 Robert Templeton
////////////////////////////////////////////////////////////////
#ifndef _STOCKSHAPEDEFS_H_
#define _STOCKSHAPEDEFS_H_
// Somewhere to internally define stock shape object information
struct StockShapeDefs
{
LONG numPoints;
LONG numPolygons;
Vector points[40];
LONG polygons[40][4];
// Polygon Selections
UCHAR posel_top[40];
UCHAR posel_sides[40];
UCHAR posel_cap[40];
UCHAR posel_bevel[40];
// Point Selections
UCHAR ptsel_top[40];
UCHAR ptsel_sides[40];
};
// =============================================================
// Cube
static StockShapeDefs Cube_Extrude =
{
8L, 5L,
{
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
0L
},
{
{7, 4, 5, 6},
{3, 7, 6, 2},
{2, 6, 5, 1},
{1, 5, 4, 0},
{0, 4, 7, 3},
0L
},
// Polygon
// - Top
{1,0,0,0,0},
// - Sides
{0,1,1,1,1},
// - Cap
{0L},
// - Bevel
{0L},
// Point
// - Top
{0,0,0,0,1,1,1,1},
// - Sides
{0L}
};
static StockShapeDefs Cube_ExtrudeCap =
{
8L, 6L,
{
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
0L
},
{
{7, 4, 5, 6},
{2, 1, 0, 3},
{3, 7, 6, 2},
{2, 6, 5, 1},
{1, 5, 4, 0},
{0, 4, 7, 3},
0L
},
// Polygon
// - Top
{1,0,0,0,0,0},
// - Sides
{0,0,1,1,1,1},
// - Cap
{0,1,0,0,0,0},
// - Bevel
{0L},
// Point
// - Top
{0,0,0,0,1,1,1,1},
// - Sides
{0L}
};
static StockShapeDefs Cube_Bevel =
{
12L, 9L,
{
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
Vector(0.0, 0.0, 0.0),
Vector(0.0, 0.0, 0.0),
Vector(0.0, 0.0, 0.0),
Vector(0.0, 0.0, 0.0),
0L
},
{
{11, 8, 9, 10},
{3, 7, 6, 2},
{2, 6, 5, 1},
{1, 5, 4, 0},
{0, 4, 7, 3},
{7, 11, 10, 6},
{6, 10, 9, 5},
{5, 9, 8, 4},
{4, 8, 11, 7},
0L
},
// Polygon
// - Top
{1,0,0,0,0,0,0,0,0},
// - Sides
{0,1,1,1,1,0,0,0,0},
// - Cap
{0L},
// - Bevel
{0,0,0,0,0,1,1,1,1},
// Point
// - Top
{0,0,0,0,0,0,0,0,1,1,1,1},
// - Sides
{0,0,0,0,1,1,1,1,0,0,0,0}
};
static StockShapeDefs Cube_BevelCap =
{
12L, 10L,
{
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
Vector(-0.5, 0.0, -0.5),
Vector(-0.5, 0.0, 0.5),
Vector(0.5, 0.0, 0.5),
Vector(0.5, 0.0, -0.5),
Vector(0.0, 0.0, 0.0),
Vector(0.0, 0.0, 0.0),
Vector(0.0, 0.0, 0.0),
Vector(0.0, 0.0, 0.0),
0L
},
{
{11, 8, 9, 10},
{2, 1, 0, 3},
{3, 7, 6, 2},
{2, 6, 5, 1},
{1, 5, 4, 0},
{0, 4, 7, 3},
{7, 11, 10, 6},
{6, 10, 9, 5},
{5, 9, 8, 4},
{4, 8, 11, 7},
0L
},
// Polygon
// - Top
{1,0,0,0,0,0,0,0,0,0},
// - Sides
{0,0,1,1,1,1,0,0,0,0},
// - Cap
{0,1,0,0,0,0,0,0,0,0},
// - Bevel
{0,0,0,0,0,0,1,1,1,1},
// Point
// - Top
{0,0,0,0,0,0,0,0,1,1,1,1},
// - Sides
{0,0,0,0,1,1,1,1,0,0,0,0}
};
...