📄 brushtemplate.c
字号:
geVec3d_Set (&OuterFocus, 0, (float)(pTemplate->Height/2), 0);
geVec3d_Set (&StartPoint, (float)(pTemplate->Width/2), (float)-(pTemplate->Height/2), 0);
CurPoint =OldPoint =StartPoint;
BottomVerts =(geVec3d *)geRam_Allocate (sizeof(geVec3d) * pTemplate->VerticalStrips);
BottomVerts[0] =CurPoint;
CurAngle =BottomCount =0;
for( index = 1; index < pTemplate->VerticalStrips; index++ )
{
// Rotate around to create our successive points...
CurAngle += AngleDelta;
geVec3d_Set
(
&CurPoint,
(float)(( StartPoint.X * cos( CurAngle ) ) +( StartPoint.Z * sin( CurAngle ) )),
StartPoint.Y,
(float)(( StartPoint.Z * cos( CurAngle ) ) -( StartPoint.X * sin( CurAngle ) ))
);
FaceVerts[2] =OuterFocus;
FaceVerts[1] =OldPoint;
FaceVerts[0] =CurPoint;
f =Face_Create(3, FaceVerts, 0);
FaceList_AddFace(fl, f);
OldPoint =CurPoint;
// Assign the current point to bottom plane...
BottomVerts[++BottomCount] =CurPoint;
}
// Create the final polygon...
CurAngle += AngleDelta;
geVec3d_Set
(
&CurPoint,
(float)(( StartPoint.X * cos( CurAngle ) ) + ( StartPoint.Z * sin( CurAngle ) )),
StartPoint.Y,
(float)(( StartPoint.Z * cos( CurAngle ) ) - ( StartPoint.X * sin( CurAngle ) ))
);
FaceVerts[2] =OuterFocus;
FaceVerts[1] =OldPoint;
FaceVerts[0] =CurPoint;
f =Face_Create(3, FaceVerts, 0);
if(f)
{
FaceList_AddFace(fl, f);
}
f =Face_Create(pTemplate->VerticalStrips, BottomVerts, 0);
if(f)
{
if(pTemplate->Style > 1) //default to hollow (if they make hollow later)
{
Face_SetFixedHull(f, GE_TRUE);
}
FaceList_AddFace(fl, f);
}
geRam_Free(BottomVerts);
if(!pTemplate->Style)
{
b =Brush_Create(BRUSH_LEAF, fl, NULL);
if(b)
{
Brush_SetSubtract(b, pTemplate->TCut);
}
return b;
}
else
{
BrushList *bl =BrushList_Create();
Brush *bh, *bm;
b =Brush_Create(BRUSH_LEAF, fl, NULL);
if(b)
{
Brush_SetHollow(b, GE_TRUE);
Brush_SetHullSize(b, (float)pTemplate->Thickness);
bh =Brush_CreateHollowFromBrush(b);
if(bh)
{
Brush_SetHollowCut(bh, GE_TRUE);
BrushList_Append(bl, b);
BrushList_Append(bl, bh);
bm =Brush_Create(BRUSH_MULTI, NULL, bl);
if(bm)
{
Brush_SetHollow(bm, GE_TRUE);
Brush_SetSubtract(bm, pTemplate->TCut);
Brush_SetHullSize(bm, (float)pTemplate->Thickness);
return bm;
}
}
else
{
Brush_Destroy(&b);
BrushList_Destroy(&bl);
}
}
else
{
BrushList_Destroy(&bl);
}
}
return NULL;
}
Brush *BrushTemplate_CreateCylinder (const BrushTemplate_Cylinder *pTemplate)
{
double CurrentXDiameter, CurrentZDiameter;
double DeltaXDiameter, DeltaZDiameter;
double CurrentXOffset, CurrentZOffset;
double DeltaXOffset, DeltaZOffset, sqrcheck;
double EllipseZ;
int NumVerticalBands, HBand, VBand;
int VertexCount=0;
geVec3d *Verts, *TopPoints;
geVec3d Current, Final, Delta;
geXForm3d YRotation;
FaceList *fl;
Face *f;
Brush *b;
NumVerticalBands = (int)(pTemplate->VerticalStripes);
if (NumVerticalBands < 3)
{
return NULL;
}
Verts =(geVec3d *)geRam_Allocate(sizeof(geVec3d)*NumVerticalBands * 2);
TopPoints =(geVec3d *)geRam_Allocate(sizeof(geVec3d)*NumVerticalBands);
fl =FaceList_Create(NumVerticalBands + 2);
if(!Verts || !TopPoints ||!fl)
{
return NULL;
}
geXForm3d_SetIdentity(&YRotation);
geXForm3d_SetYRotation(&YRotation, (M_PI * 2.0f)/(geFloat)NumVerticalBands);
// Start with the top of cylinder
CurrentXDiameter =pTemplate->TopXSize;
CurrentZDiameter =pTemplate->TopZSize;
DeltaXDiameter =(pTemplate->BotXSize - pTemplate->TopXSize);
DeltaZDiameter =(pTemplate->BotZSize - pTemplate->TopZSize);
// Get the offset amounts
CurrentXOffset =pTemplate->TopXOffset;
CurrentZOffset =pTemplate->TopZOffset;
DeltaXOffset =(pTemplate->BotXOffset - pTemplate->TopXOffset);
DeltaZOffset =(pTemplate->BotZOffset - pTemplate->TopZOffset);
// Get the band positions and deltas
geVec3d_Set(&Current, (float)(pTemplate->TopXSize / 2), (float)(pTemplate->YSize / 2), 0.0);
geVec3d_Set(&Delta, (float)((pTemplate->BotXSize / 2) - Current.X), (float)(-(pTemplate->YSize/2) - Current.Y), 0.0);
for(HBand = 0;HBand <= 1;HBand++)
{
Final = Current;
for(VBand = 0;VBand < NumVerticalBands;VBand++)
{
// Get the elliptical Z value
// (x^2/a^2) + (z^2/b^2) = 1
// z = sqrt(b^2(1 - x^2/a^2))
sqrcheck=( ((CurrentZDiameter/2)*(CurrentZDiameter/2))
* (1.0 - (Final.X*Final.X)
/ ( (CurrentXDiameter/2)*(CurrentXDiameter/2) )) );
if(sqrcheck <0.0)
sqrcheck=0.0;
EllipseZ = sqrt(sqrcheck);
// Check if we need to negate this thing
if(VBand > (NumVerticalBands/2))
EllipseZ = -EllipseZ;
geVec3d_Set
(
&Verts[VertexCount],
(float)(Final.X + CurrentXOffset),
Final.Y,
(float)(EllipseZ + CurrentZOffset)
);
VertexCount++;
// Rotate the point around the Y to get the next vertical band
geXForm3d_Rotate(&YRotation, &Final, &Final);
}
CurrentXDiameter +=DeltaXDiameter;
CurrentZDiameter +=DeltaZDiameter;
CurrentXOffset +=DeltaXOffset;
CurrentZOffset +=DeltaZOffset;
geVec3d_Add(&Current, &Delta, &Current);
}
for(VBand=0;VBand < NumVerticalBands;VBand++)
{
TopPoints[VBand] =Verts[VBand];
}
f =Face_Create(NumVerticalBands, TopPoints, 0);
if(f)
{
if(pTemplate->Solid > 1)
{
Face_SetFixedHull(f, GE_TRUE);
}
FaceList_AddFace(fl, f);
}
for(VBand=NumVerticalBands-1, HBand=0;VBand >=0;VBand--, HBand++)
{
TopPoints[HBand] =Verts[VBand + NumVerticalBands];
}
f =Face_Create(NumVerticalBands, TopPoints, 0);
if(f)
{
if(pTemplate->Solid > 1)
{
Face_SetFixedHull(f, GE_TRUE);
}
FaceList_AddFace(fl, f);
}
// Generate the polygons
for(HBand = 0;HBand < 1;HBand++)
{
for(VBand = 0;VBand < NumVerticalBands;VBand++)
{
TopPoints[3] =Verts[(HBand * NumVerticalBands) + VBand];
TopPoints[2] =Verts[(HBand * NumVerticalBands) + ((VBand + 1) % NumVerticalBands)];
TopPoints[1] =Verts[((HBand + 1) * NumVerticalBands) + ((VBand + 1) % NumVerticalBands)];
TopPoints[0] =Verts[((HBand + 1) * NumVerticalBands) + VBand];
f =Face_Create(4, TopPoints, 0);
if(f)
{
FaceList_AddFace(fl, f);
}
}
}
geRam_Free(Verts);
geRam_Free(TopPoints);
if(!pTemplate->Solid)
{
b =Brush_Create(BRUSH_LEAF, fl, NULL);
if(b)
{
Brush_SetSubtract(b, pTemplate->TCut);
}
return b;
}
else
{
BrushList *bl =BrushList_Create();
Brush *bh, *bm;
b =Brush_Create(BRUSH_LEAF, fl, NULL);
if(b)
{
Brush_SetHollow(b, GE_TRUE);
Brush_SetHullSize(b, (float)pTemplate->Thickness);
bh =Brush_CreateHollowFromBrush(b);
if(bh)
{
Brush_SetHollowCut(bh, GE_TRUE);
BrushList_Append(bl, b);
BrushList_Append(bl, bh);
bm =Brush_Create(BRUSH_MULTI, NULL, bl);
if(bm)
{
Brush_SetHollow(bm, GE_TRUE);
Brush_SetSubtract(bm, pTemplate->TCut);
Brush_SetHullSize(bm, (float)pTemplate->Thickness);
return bm;
}
}
else
{
Brush_Destroy(&b);
BrushList_Destroy(&bl);
}
}
else
{
BrushList_Destroy(&bl);
}
}
return NULL;
}
Brush *BrushTemplate_CreateSpheroid (const BrushTemplate_Spheroid *pTemplate)
{
double z, ring_radius, r, dz, t, dt;
int vcnt, HBand, VBand;
geVec3d *sv, FaceVerts[4];
FaceList *fl;
Face *f;
Brush *b;
if((pTemplate->HorizontalBands < 2) || (pTemplate->VerticalBands < 3))
{
return GE_FALSE ;
}
fl =FaceList_Create((pTemplate->HorizontalBands)* pTemplate->VerticalBands);
sv =(geVec3d *)geRam_Allocate(sizeof(geVec3d) * (((pTemplate->HorizontalBands-1) * pTemplate->VerticalBands)+2));
r =pTemplate->YSize;
vcnt =0;
geVec3d_Set (&sv[vcnt], 0.0f, pTemplate->YSize, 0.0f);
vcnt++;
dz =2.0*r/(double)(pTemplate->HorizontalBands-1);
for(z=(-r)+dz/2.0; z<(r-dz/2.0+dz/4.0); z+=dz)
{
ring_radius =sqrt(r*r - z*z);
dt =PI2 /(double)(pTemplate->VerticalBands);
for(t=0.0;t < PI2-(dt*0.5);t+=dt)
{
sv[vcnt].X =(float)(sin(t) * ring_radius);
sv[vcnt].Z =(float)(cos(t) * ring_radius);
sv[vcnt++].Y=(float)(-z);
}
}
sv[vcnt].X =0.0f;
sv[vcnt].Y =(float)(-pTemplate->YSize);
sv[vcnt++].Z=0.0f;
for(VBand=0;VBand < pTemplate->VerticalBands;VBand++)
{
FaceVerts[0] =sv[0];
FaceVerts[1] =sv[(((1 + VBand) % pTemplate->VerticalBands) + 1)];
FaceVerts[2] =sv[(VBand % pTemplate->VerticalBands)+1];
f =Face_Create(3, FaceVerts, 0);
if(f)
{
FaceList_AddFace(fl, f);
}
}
for(HBand=1;HBand < (pTemplate->HorizontalBands-1);HBand++)
{
for(VBand=0;VBand < pTemplate->VerticalBands;VBand++)
{
FaceVerts[0] =sv[(((HBand-1)*pTemplate->VerticalBands)+1)+VBand];
FaceVerts[1] =sv[(((HBand-1)*pTemplate->VerticalBands)+1)+((VBand+1)%pTemplate->VerticalBands)];
FaceVerts[2] =sv[((HBand*pTemplate->VerticalBands)+1)+((VBand+1)%pTemplate->VerticalBands)];
FaceVerts[3] =sv[((HBand*pTemplate->VerticalBands)+1)+VBand];
f =Face_Create(4, FaceVerts, 0);
if(f)
{
FaceList_AddFace(fl, f);
}
}
}
for(VBand=0;VBand < pTemplate->VerticalBands;VBand++)
{
FaceVerts[0] =sv[1+((pTemplate->HorizontalBands-2)*pTemplate->VerticalBands)+VBand];
FaceVerts[1] =sv[1+((pTemplate->HorizontalBands-2)*pTemplate->VerticalBands)+((VBand+1)%pTemplate->VerticalBands)];
FaceVerts[2] =sv[((pTemplate->HorizontalBands-1)*pTemplate->VerticalBands)+1];
f =Face_Create(3, FaceVerts, 0);
if(f)
{
FaceList_AddFace(fl, f);
}
}
geRam_Free(sv);
if(!pTemplate->Solid)
{
b =Brush_Create(BRUSH_LEAF, fl, NULL);
if(b)
{
Brush_SetSubtract(b, pTemplate->TCut);
}
return b;
}
else
{
BrushList *bl =BrushList_Create();
Brush *bh, *bm;
b =Brush_Create(BRUSH_LEAF, fl, NULL);
if(b)
{
Brush_SetHollow(b, GE_TRUE);
Brush_SetHullSize(b, (float)pTemplate->Thickness);
bh =Brush_CreateHollowFromBrush(b);
if(bh)
{
Brush_SetHollowCut(bh, GE_TRUE);
BrushList_Append(bl, b);
BrushList_Append(bl, bh);
bm =Brush_Create(BRUSH_MULTI, NULL, bl);
if(bm)
{
Brush_SetHollow(bm, GE_TRUE);
Brush_SetSubtract(bm, pTemplate->TCut);
Brush_SetHullSize(bm, (float)pTemplate->Thickness);
return bm;
}
}
else
{
Brush_Destroy(&b);
BrushList_Destroy(&bl);
}
}
else
{
BrushList_Destroy(&bl);
}
}
return NULL;
}
Brush *BrushTemplate_CreateStaircase (const BrushTemplate_Staircase *pTemplate)
{
int i;
geFloat HalfWidth = (geFloat)(pTemplate->Width/2);
geFloat HalfHeight = (geFloat)(pTemplate->Height/2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -