📄 mlr_i_pmesh.cpp
字号:
{
s = X_Axis;
t = Y_Axis;
}
//
//----------------------------------------
// Initialize the vertex and leg variables
//----------------------------------------
//
Point3D *v1, *v2, *v3;
v1 = &coords[index[poly_start]];
v2 = &coords[index[poly_start+1]];
v3 = &coords[index[poly_start+2]];
//
//---------------------------------------
// Get the projection of the impact point
//---------------------------------------
//
Scalar s0 = impact[s] - (*v1)[s];
Scalar t0 = impact[t] - (*v1)[t];
Scalar s1 = (*v2)[s] - (*v1)[s];
Scalar t1 = (*v2)[t] - (*v1)[t];
//
//------------------------------------------------------------
// For each triangle, figure out what the second leg should be
//------------------------------------------------------------
//
bool local_hit = false;
int next_v = 3;
Test_Triangle:
Check_Pointer(v3);
Scalar s2 = (*v3)[s] - (*v1)[s];
Scalar t2 = (*v3)[t] - (*v1)[t];
//
//--------------------------------
// Now, see if we hit the triangle
//--------------------------------
//
if (Small_Enough(s1))
{
Verify(!Small_Enough(s2));
Scalar beta = s0 / s2;
if (beta >= 0.0f && beta < 1.0f)
{
Verify(!Small_Enough(t1));
Scalar alpha = (t0 - beta*t2) / t1;
local_hit = (alpha >= 0.0f && alpha+beta <= 1.0f);
}
}
else
{
Scalar beta = (t0*s1 - s0*t1);
Scalar alpha = (t2*s1 - s2*t1);
beta /= alpha;
if (beta >= 0.0f && beta <= 1.0f)
{
alpha = (s0 - beta*s2) / s1;
local_hit = (alpha >= 0.0f && alpha+beta <= 1.0f);
}
}
//
//-----------------------------
// Set up for the next triangle
//-----------------------------
//
if (next_v < stride && !local_hit)
{
v2 = v3;
v3 = &coords[index[poly_start+next_v++]];
s1 = s2;
t1 = t2;
goto Test_Triangle;
}
//
//----------------------------------------------------
// Handle the hit status, and move to the next polygon
//----------------------------------------------------
//
if (local_hit)
{
hit = true;
line->length = distance;
if (negate)
normal->Negate(plane->normal);
else
*normal = plane->normal;
Verify(*normal * line->direction <= -SMALL);
}
poly_start += stride;
}
//
//----------------------
// Return the hit status
//----------------------
//
return hit;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLR_I_PMesh*
MidLevelRenderer::CreateIndexedCube_NoColor_NoLit(
Scalar half,
MLRState *state
)
{
gos_PushCurrentHeap(Heap);
MLR_I_PMesh *ret = new MLR_I_PMesh();
Register_Object(ret);
Point3D *coords = new Point3D [8];
Register_Object(coords);
coords[0] = Point3D( half, -half, half);
coords[1] = Point3D(-half, -half, half);
coords[2] = Point3D( half, -half, -half);
coords[3] = Point3D(-half, -half, -half);
coords[4] = Point3D(-half, half, half);
coords[5] = Point3D( half, half, half);
coords[6] = Point3D( half, half, -half);
coords[7] = Point3D(-half, half, -half);
unsigned char *lengths = new unsigned char [6];
Register_Pointer(lengths);
int i;
for(i=0;i<6;i++)
{
lengths[i] = 4;
}
ret->SetSubprimitiveLengths(lengths, 6);
ret->SetCoordData(coords, 8);
unsigned short *index = new unsigned short [6*4];
Register_Pointer(index);
index[0] = 0;
index[1] = 2;
index[2] = 6;
index[3] = 5;
index[4] = 0;
index[5] = 5;
index[6] = 4;
index[7] = 1;
index[8] = 5;
index[9] = 6;
index[10] = 7;
index[11] = 4;
index[12] = 2;
index[13] = 3;
index[14] = 7;
index[15] = 6;
index[16] = 1;
index[17] = 4;
index[18] = 7;
index[19] = 3;
index[20] = 0;
index[21] = 1;
index[22] = 3;
index[23] = 2;
ret->SetIndexData(index, 6*4);
ret->FindFacePlanes();
Vector2DScalar *texCoords = new Vector2DScalar[8];
Register_Pointer(texCoords);
texCoords[0] = Vector2DScalar(0.0f, 0.0f);
texCoords[1] = Vector2DScalar(0.0f, 0.0f);
texCoords[2] = Vector2DScalar(0.0f, 0.0f);
texCoords[3] = Vector2DScalar(0.0f, 0.0f);
texCoords[4] = Vector2DScalar(0.0f, 0.0f);
texCoords[5] = Vector2DScalar(0.0f, 0.0f);
texCoords[6] = Vector2DScalar(0.0f, 0.0f);
texCoords[7] = Vector2DScalar(0.0f, 0.0f);
if(state != NULL)
{
ret->SetReferenceState(*state);
if(state->GetTextureHandle() > 0)
{
texCoords[0] = Vector2DScalar(0.0f, 0.0f);
texCoords[1] = Vector2DScalar(1.0f, 0.0f);
texCoords[2] = Vector2DScalar(0.25f, 0.25f);
texCoords[3] = Vector2DScalar(0.75f, 0.25f);
texCoords[4] = Vector2DScalar(1.0f, 1.0f);
texCoords[5] = Vector2DScalar(0.0f, 1.0f);
texCoords[6] = Vector2DScalar(0.25f, 0.75f);
texCoords[7] = Vector2DScalar(0.75f, 0.75f);
}
}
ret->SetTexCoordData(texCoords, 8);
Unregister_Object(texCoords);
delete [] texCoords;
Unregister_Pointer(index);
delete [] index;
Unregister_Pointer(lengths);
delete [] lengths;
Unregister_Object(coords);
delete [] coords;
gos_PopCurrentHeap();
return ret;
}
long MidLevelRenderer::triDrawn = 0;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MidLevelRenderer::subdivide (
Point3D *coords,
Point3D& v1,
Point3D& v2,
Point3D& v3,
long depth,
long tri2draw,
float rad
)
{
Point3D v12(0.0f, 0.0f, 0.0f), v23(0.0f, 0.0f, 0.0f), v31(0.0f, 0.0f, 0.0f);
int i;
if (depth == 0)
{
if (tri2draw > triDrawn)
{
coords[3*triDrawn].Multiply(v1, rad);
coords[3*triDrawn+1].Multiply(v3, rad);
coords[3*triDrawn+2].Multiply(v2, rad);
}
triDrawn++;
return;
}
for (i=0;i<3;i++)
{
v12[i] = v1[i] + v2[i];
v23[i] = v2[i] + v3[i];
v31[i] = v3[i] + v1[i];
}
v12.Normalize(v12);
v23.Normalize(v23);
v31.Normalize(v31);
MidLevelRenderer::subdivide (coords, v1, v12, v31, depth-1, tri2draw, rad);
MidLevelRenderer::subdivide (coords, v2, v23, v12, depth-1, tri2draw, rad);
MidLevelRenderer::subdivide (coords, v3, v31, v23, depth-1, tri2draw, rad);
MidLevelRenderer::subdivide (coords, v12, v23, v31, depth-1, tri2draw, rad);
}
float MidLevelRenderer::vdata[12][3] = {
{-ICO_X, 0.0f, ICO_Z}, {ICO_X, 0.0f, ICO_Z}, {-ICO_X, 0.0f, -ICO_Z}, {ICO_X, 0.0f, -ICO_Z},
{0.0f, ICO_Z, ICO_X}, {0.0f, ICO_Z, -ICO_X}, {0.0f, -ICO_Z, ICO_X}, {0.0f, -ICO_Z, -ICO_X},
{ICO_Z, ICO_X, 0.0f}, {-ICO_Z, ICO_X, 0.0f}, {ICO_Z, -ICO_X, 0.0f}, {-ICO_Z, -ICO_X, 0.0f}
};
unsigned int MidLevelRenderer::tindices [20][3] = {
{0, 4, 1}, {0, 9, 4}, {9, 5, 4}, {4, 5, 8}, {4, 8, 1},
{8, 10, 1}, {8, 3, 10}, {5, 3, 8}, {5, 2, 3}, {2, 7, 3},
{7, 10, 3}, {7, 6, 10}, {7, 11, 6}, {11, 0, 6}, {0, 1, 6},
{6, 1, 10}, {9, 0, 11}, {9, 11, 2}, {9, 2, 5}, {7, 2, 11}
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
MLRShape*
MidLevelRenderer::CreateIndexedIcosahedron_NoColor_NoLit(
IcoInfo& icoInfo,
MLRState *state
)
{
gos_PushCurrentHeap(Heap);
MLRShape *ret = new MLRShape(20);
Register_Object(ret);
int i, j, k;
long nrTri = (long) ceil (icoInfo.all * pow (4.0f, icoInfo.depth));
Point3D v[3];
if(3*nrTri >= Limits::Max_Number_Vertices_Per_Mesh)
{
nrTri = Limits::Max_Number_Vertices_Per_Mesh/3;
}
unsigned char *lengths = new unsigned char [nrTri];
Register_Pointer(lengths);
for(i=0;i<nrTri;i++)
{
lengths[i] = 3;
}
Point3D *coords = new Point3D [nrTri*3];
Register_Pointer(coords);
Point3D *collapsedCoords = NULL;
if(icoInfo.indexed==true)
{
collapsedCoords = new Point3D [nrTri*3];
Register_Pointer(collapsedCoords);
}
unsigned short *index = new unsigned short [nrTri*3];
Register_Pointer(index);
Vector2DScalar *texCoords = new Vector2DScalar[nrTri*3];
Register_Pointer(texCoords);
int uniquePoints = 0;
for (k=0;k<20;k++)
{
triDrawn = 0;
MLR_I_PMesh *mesh = new MLR_I_PMesh();
Register_Object(mesh);
// setup vertex position information
for (j=0;j<3;j++)
{
v[j].x = vdata[tindices[k][j]][0];
v[j].y = vdata[tindices[k][j]][1];
v[j].z = vdata[tindices[k][j]][2];
}
subdivide (coords, v[0], v[1], v[2], icoInfo.depth, nrTri, icoInfo.radius);
mesh->SetSubprimitiveLengths(lengths, nrTri);
if(icoInfo.indexed==true)
{
uniquePoints = 1;
collapsedCoords[0] = coords[0];
index[0] = 0;
for(i=1;i<nrTri*3;i++)
{
for(j=0;j<uniquePoints;j++)
{
if(coords[i] == collapsedCoords[j])
{
break;
}
}
if(j==uniquePoints)
{
collapsedCoords[uniquePoints++] = coords[i];
}
index[i] = static_cast<unsigned short>(j);
}
mesh->SetCoordData(collapsedCoords, uniquePoints);
}
else
{
uniquePoints = nrTri*3;
for(i=0;i<nrTri*3;i++)
{
index[i] = static_cast<unsigned short>(i);
}
mesh->SetCoordData(coords, nrTri*3);
}
mesh->SetIndexData(index, nrTri*3);
mesh->FindFacePlanes();
if(state == NULL)
{
for(i=0;i<uniquePoints;i++)
{
texCoords[i] = Vector2DScalar(0.0f, 0.0f);
}
}
else
{
mesh->SetReferenceState(*state);
if(state->GetTextureHandle() > 0)
{
if(icoInfo.indexed==true)
{
for(i=0;i<uniquePoints;i++)
{
texCoords[i] =
Vector2DScalar(
(1.0f + collapsedCoords[i].x)/2.0f,
(1.0f + collapsedCoords[i].y)/2.0f
);
}
}
else
{
for(i=0;i<nrTri;i++)
{
texCoords[3*i] =
Vector2DScalar(
(1.0f + coords[3*i].x)/2.0f,
(1.0f + coords[3*i].y)/2.0f
);
texCoords[3*i+1] =
Vector2DScalar(
(1.0f + coords[3*i+1].x)/2.0f,
(1.0f + coords[3*i+1].y)/2.0f
);
texCoords[3*i+2] =
Vector2DScalar(
(1.0f + coords[3*i+2].x)/2.0f,
(1.0f + coords[3*i+2].y)/2.0f
);
}
}
}
else
{
for(i=0;i<uniquePoints;i++)
{
texCoords[i] = Vector2DScalar(0.0f, 0.0f);
}
}
}
mesh->SetTexCoordData(texCoords, uniquePoints);
ret->Add(mesh);
mesh->DetachReference();
}
Unregister_Pointer(texCoords);
delete [] texCoords;
Unregister_Pointer(index);
delete [] index;
if(icoInfo.indexed==true)
{
Unregister_Pointer(collapsedCoords);
delete [] collapsedCoords;
}
Unregister_Pointer(coords);
delete [] coords;
Unregister_Pointer(lengths);
delete [] lengths;
gos_PopCurrentHeap();
return ret;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -