📄 sky.cc
字号:
// for(k = 0; k < numPoints; ++k)
// {
// glColor4f(1.0,1.0,1.0, renderAlpha[k]*renderSAlpha[k]);
// glTexCoord2f(renderTexPoints[k].x,renderTexPoints[k].y);
// glVertex3f(renderPoints[k].x,renderPoints[k].y,renderPoints[k].z);
// }
if(gCelestials)
for(k = 0; k < numPoints; ++k)
{
glColor4f(dn.red,dn.green,dn.blue, renderAlpha[k]*renderSAlpha[k]);
glTexCoord2f(renderTexPoints[k].x,renderTexPoints[k].y);
glVertex3f(renderPoints[k].x,renderPoints[k].y,renderPoints[k].z);
}
else
for(k = 0; k < numPoints; ++k)
{
glColor4f(1.0,1.0,1.0, renderAlpha[k]*renderSAlpha[k]);
glTexCoord2f(renderTexPoints[k].x,renderTexPoints[k].y);
glVertex3f(renderPoints[k].x,renderPoints[k].y,renderPoints[k].z);
}
//celestial end
glEnd();
++start;
}
}
glDisable(GL_BLEND);
}
void Cloud::setRenderPoints(Point3F* renderPoints, Point2F* renderTexPoints,
F32* renderAlpha, F32* renderSAlpha, S32 index)
{
S32 offset[4] = {0,5,6,1};
for(S32 x = 0; x < 4; ++x)
{
renderPoints[x].set(mPoints[index+offset[x]].x, mPoints[index+offset[x]].y, mPoints[index+offset[x]].z);
renderTexPoints[x].set(mTexCoords[index+offset[x]].x, mTexCoords[index+offset[x]].y);
renderAlpha[x] = mAlpha[index+offset[x]];
renderSAlpha[x] = stormAlpha[index+offset[x]];
}
}
//---------------------------------------------------------------------------
void Cloud::setTextPer(F32 cloudTextPer)
{
mTextureScale.set(cloudTextPer / 4.0, cloudTextPer / 4.0);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Storm Code
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
void Cloud::updateStorm()
{
if(!mGStormData.FadeOut && !mGStormData.FadeIn) {
alphaCenter += (stormUpdate * mOffset);
F32 update, center;
if(mGStormData.stormDir == 'x') {
update = stormUpdate.x;
center = alphaCenter.x;
}
else {
update = stormUpdate.y;
center = alphaCenter.y;
}
if(mGStormData.stormState == comingIn) {
if((update > 0 && center > 0) || (update < 0 && center < 0))
mGStormData.FadeIn = true;
}
else
if((update > 0 && center > mRadius*2) || (update < 0 && center < -mRadius*2)) {
// Con::printf("Cloud %d is done.", mGStormData.currentCloud);
mGStormData.StormOn = --mGStormData.currentCloud >= 0;
if(mGStormData.StormOn) {
mGStormData.FadeOut = true;
return;
}
}
}
calcStormAlpha();
}
//---------------------------------------------------------------------------
void Cloud::calcStormAlpha()
{
if(mGStormData.FadeIn)
{
bool done = true;
for(int i = 0; i < 25; ++i)
{
stormAlpha[i] += (mGStormData.fadeSpeed * mOffset);
if(stormAlpha[i] >= 1.0f)
stormAlpha[i] = 1.0f;
else
done = false;
}
if(done)
{
// Con::printf("Cloud %d is done.", mGStormData.currentCloud);
mGStormData.StormOn = ++mGStormData.currentCloud < mGStormData.numCloudLayers;
mGStormData.FadeIn = false;
}
}
else if(mGStormData.FadeOut)
{
bool done = true;
for(int i = 0; i < 25; ++i)
{
stormAlpha[i] -= (mGStormData.fadeSpeed * mOffset);
if(stormAlpha[i] <= mAlphaSave[i])
stormAlpha[i] = mAlphaSave[i];
else
done = false;
}
if(done)
mGStormData.FadeOut = false;
}
else
for(int i = 0; i < 25; ++i)
{
stormAlpha[i] = 1.0f -((Point3F(mPoints[i].x-alphaCenter.x, mPoints[i].y-alphaCenter.y, mPoints[i].z).len())/mRadius);
if(stormAlpha[i] < 0.0f)
stormAlpha[i]=0.0f;
else if(stormAlpha[i] > 1.0f)
stormAlpha[i] = 1.0f;
}
}
//---------------------------------------------------------------------------
void Cloud::calcStorm(F32 speed, F32 fadeSpeed)
{
float tempX, tempY;
float windSlop = 0.0f;
if(mSpeed.x != 0)
windSlop = mSpeed.y/mSpeed.x;
tempX = (mSpeed.x < 0) ? -mSpeed.x : mSpeed.x;
tempY = (mSpeed.y < 0) ? -mSpeed.y : mSpeed.y;
if(tempX >= tempY)
{
alphaCenter.x =(mSpeed.x < 0) ? mRadius * -2 : mRadius * 2;
alphaCenter.y = windSlop*alphaCenter.x;
stormUpdate.x = alphaCenter.x > 0.0f ? -speed : speed;
stormUpdate.y = alphaCenter.y > 0.0f ? -speed * windSlop : speed * windSlop;
mGStormData.stormDir = 'x';
}
else
{
alphaCenter.y = (mSpeed.y < 0) ? mRadius * 2 : mRadius * -2;
alphaCenter.x = windSlop * alphaCenter.y;
/* if(windSlop != 0)
alphaCenter.x = (1/windSlop)*alphaCenter.y;
else
alphaCenter.x = 0.0f;
*/
stormUpdate.y = alphaCenter.y > 0.0f ? -speed : speed;
stormUpdate.x = alphaCenter.x > 0.0f ? -speed * (1/windSlop) : speed * (1/windSlop);
mGStormData.stormDir = 'y';
}
mGStormData.fadeSpeed = fadeSpeed;
for(int i = 0; i < 25; ++i)
{
mAlphaSave[i] = 1.0f - (mPoints[i].len()/mRadius);
if(mAlphaSave[i] < 0.0f)
mAlphaSave[i]=0.0f;
else if(mAlphaSave[i] > 1.0f)
mAlphaSave[i] = 1.0f;
}
if(mGStormData.stormState == goingOut)
alphaCenter.set(0.0f, 0.0f);
}
//---------------------------------------------------------------------------
void Cloud::startStorm(SkyState state)
{
mGStormData.StormOn = true;
mGStormData.stormState = state;
if(state == goingOut)
{
mGStormData.FadeOut= true;
mGStormData.FadeIn = false;
mGStormData.currentCloud = mGStormData.numCloudLayers - 1;
}
else
{
mGStormData.FadeIn = false;
mGStormData.FadeOut= false;
mGStormData.currentCloud = 0;
}
}
void Cloud::clipToPlane(Point3F* points, Point2F* texPoints, F32* alphaPoints,
F32* sAlphaPoints, U32& rNumPoints, const PlaneF& rPlane)
{
S32 start = -1;
for (U32 i = 0; i < rNumPoints; i++) {
if (rPlane.whichSide(points[i]) == PlaneF::Front) {
start = i;
break;
}
}
// Nothing was in front of the plane...
if (start == -1) {
rNumPoints = 0;
return;
}
U32 numFinalPoints = 0;
Point3F finalPoints[128];
Point2F finalTexPoints[128];
F32 finalAlpha[128];
F32 finalSAlpha[128];
U32 baseStart = start;
U32 end = (start + 1) % rNumPoints;
while (end != baseStart) {
const Point3F& rStartPoint = points[start];
const Point3F& rEndPoint = points[end];
const Point2F& rStartTexPoint = texPoints[start];
const Point2F& rEndTexPoint = texPoints[end];
PlaneF::Side fSide = rPlane.whichSide(rStartPoint);
PlaneF::Side eSide = rPlane.whichSide(rEndPoint);
S32 code = fSide * 3 + eSide;
switch (code) {
case 4: // f f
case 3: // f o
case 1: // o f
case 0: // o o
// No Clipping required
//Alpha
finalAlpha[numFinalPoints] = alphaPoints[start];
finalSAlpha[numFinalPoints] = sAlphaPoints[start];
//Points
finalPoints[numFinalPoints] = points[start];
finalTexPoints[numFinalPoints++] = texPoints[start];
start = end;
end = (end + 1) % rNumPoints;
break;
case 2: { // f b
// In this case, we emit the front point, Insert the intersection,
// and advancing to point to first point that is in front or on...
//Alpha
finalAlpha[numFinalPoints] = alphaPoints[start];
finalSAlpha[numFinalPoints] = sAlphaPoints[start];
//Points
finalPoints[numFinalPoints] = points[start];
finalTexPoints[numFinalPoints++] = texPoints[start];
Point3F vector = rEndPoint - rStartPoint;
F32 t = -(rPlane.distToPlane(rStartPoint) / mDot(rPlane, vector));
//Alpha
finalAlpha[numFinalPoints] = alphaPoints[start]+ ((alphaPoints[end] - alphaPoints[start]) * t);
finalSAlpha[numFinalPoints] = sAlphaPoints[start]+ ((sAlphaPoints[end] - sAlphaPoints[start]) * t);
//Polygon Points
Point3F intersection = rStartPoint + (vector * t);
finalPoints[numFinalPoints] = intersection;
//Texture Points
Point2F texVec = rEndTexPoint - rStartTexPoint;
Point2F texIntersection = rStartTexPoint + (texVec * t);
finalTexPoints[numFinalPoints++] = texIntersection;
U32 endSeek = (end + 1) % rNumPoints;
while (rPlane.whichSide(points[endSeek]) == PlaneF::Back)
endSeek = (endSeek + 1) % rNumPoints;
end = endSeek;
start = (end + (rNumPoints - 1)) % rNumPoints;
const Point3F& rNewStartPoint = points[start];
const Point3F& rNewEndPoint = points[end];
const Point2F& rNewStartTexPoint = texPoints[start];
const Point2F& rNewEndTexPoint = texPoints[end];
vector = rNewEndPoint - rNewStartPoint;
t = -(rPlane.distToPlane(rNewStartPoint) / mDot(rPlane, vector));
//Alpha
alphaPoints[start] = alphaPoints[start]+ ((alphaPoints[end] - alphaPoints[start]) * t);
sAlphaPoints[start] = sAlphaPoints[start]+ ((sAlphaPoints[end] - sAlphaPoints[start]) * t);
//Polygon Points
intersection = rNewStartPoint + (vector * t);
points[start] = intersection;
//Texture Points
texVec = rNewEndTexPoint - rNewStartTexPoint;
texIntersection = rNewStartTexPoint + (texVec * t);
texPoints[start] = texIntersection;
}
break;
case -1: {// o b
// In this case, we emit the front point, and advance to point to first
// point that is in front or on...
//
//Alpha
finalAlpha[numFinalPoints] = alphaPoints[start];
finalSAlpha[numFinalPoints] = sAlphaPoints[start];
//Points
finalPoints[numFinalPoints] = points[start];
finalTexPoints[numFinalPoints++] = texPoints[start];
U32 endSeek = (end + 1) % rNumPoints;
while (rPlane.whichSide(points[endSeek]) == PlaneF::Back)
endSeek = (endSeek + 1) % rNumPoints;
end = endSeek;
start = (end + (rNumPoints - 1)) % rNumPoints;
const Point3F& rNewStartPoint = points[start];
const Point3F& rNewEndPoint = points[end];
const Point2F& rNewStartTexPoint = texPoints[start];
const Point2F& rNewEndTexPoint = texPoints[end];
Point3F vector = rNewEndPoint - rNewStartPoint;
F32 t = -(rPlane.distToPlane(rNewStartPoint) / mDot(rPlane, vector));
//Alpha
alphaPoints[start] = alphaPoints[start] + ((alphaPoints[end] - alphaPoints[start]) * t);
sAlphaPoints[start] = sAlphaPoints[start] + ((sAlphaPoints[end] - sAlphaPoints[start]) * t);
//Polygon Points
Point3F intersection = rNewStartPoint + (vector * t);
points[start] = intersection;
//Texture Points
Point2F texVec = rNewEndTexPoint - rNewStartTexPoint;
Point2F texIntersection = rNewStartTexPoint + (texVec * t);
texPoints[start] = texIntersection;
}
break;
case -2: // b f
case -3: // b o
case -4: // b b
// In the algorithm used here, this should never happen...
AssertISV(false, "SGUtil::clipToPlane: error in polygon clipper");
break;
default:
AssertFatal(false, "SGUtil::clipToPlane: bad outcode");
break;
}
}
// Emit the last point.
//Alpha
finalAlpha[numFinalPoints] = alphaPoints[start];
finalSAlpha[numFinalPoints] = sAlphaPoints[start];
//Points
finalPoints[numFinalPoints] = points[start];
finalTexPoints[numFinalPoints++] = texPoints[start];
AssertFatal(numFinalPoints >= 3, avar("Error, this shouldn't happen! Invalid winding in clipToPlane: %d", numFinalPoints));
// Copy the new r
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -