📄 mlrprimitive.cpp
字号:
MLRPrimitive::SetColorData(
#if COLOR_AS_DWORD
const DWORD *data,
#else
const RGBAColor *data,
#endif
int dataSize
)
{
Check_Object(this);
Check_Pointer(data);
Verify(coords.GetLength() == 0 || dataSize == coords.GetLength());
Verify(normals.GetLength() == 0 || dataSize == normals.GetLength());
Verify(texCoords.GetLength() == 0 || dataSize == texCoords.GetLength());
colors.AssignData(data, dataSize);
litColors.SetLength(dataSize);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::GetColorData(
#if COLOR_AS_DWORD
DWORD **data,
#else
RGBAColor **data,
#endif
int *dataSize
)
{
Check_Object(this);
*data = colors.GetData();
*dataSize = colors.GetLength();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::SetNormalData(
const Vector3D *data,
int dataSize
)
{
Check_Object(this);
Check_Pointer(data);
Verify(coords.GetLength() == 0 || dataSize == coords.GetLength());
Verify(colors.GetLength() == 0 || dataSize == colors.GetLength());
Verify(texCoords.GetLength() == 0 || dataSize == texCoords.GetLength());
normals.AssignData(data, dataSize);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::GetNormalData(
Vector3D **data,
int *dataSize
)
{
Check_Object(this);
*data = normals.GetData();
*dataSize = normals.GetLength();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::SetTexCoordData(
const Vector2DScalar *data,
int dataSize
)
{
Check_Object(this);
Check_Pointer(data);
Verify(coords.GetLength() == 0 || dataSize == coords.GetLength());
Verify(colors.GetLength() == 0 || dataSize == colors.GetLength());
Verify(normals.GetLength() == 0 || dataSize == normals.GetLength());
texCoords.AssignData((Vector2DScalar *)data, dataSize);
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::GetTexCoordData(
Vector2DScalar **data,
int *dataSize
)
{
Check_Object(this);
*data = texCoords.GetData();
*dataSize = texCoords.GetLength();
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::Transform(Matrix4D *mat)
{
Check_Object(this);
int i, len = coords.GetLength();
for(i=0;i<len;i++)
{
transformedCoords[i].Multiply(coords[i], *mat);
}
#ifdef LAB_ONLY
Statistics::MLR_TransformedVertices += len;
#endif
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::Lighting (
MLRLight **lights,
int nrLights
)
{
Check_Object(this);
// set the to use colors to the original colors ...
// only lighting could overwrite this;
actualColors = &colors;
if(nrLights == 0)
{
return;
}
if(normals.GetLength() == 0)
{
return;
}
if(lights == NULL)
{
return;
}
switch (GetCurrentState().GetLightingMode())
{
case MLRState::LightingOffMode:
return;
case MLRState::LightingClassicOnlyMode:
{
Verify(colors.GetLength() == litColors.GetLength());
Verify(normals.GetLength() == colors.GetLength());
Verify(coords.GetLength() == colors.GetLength());
int i, k, len = colors.GetLength();
MLRVertexData vertexData;
#if COLOR_AS_DWORD
TO_DO;
#else
RGBAColor *color = &colors[0];
RGBAColor *litColor = &litColors[0];
#if USE_ASSEMBLER_CODE
_asm {
push esi
push edi
mov esi, color
mov edi, litColor
mov ecx, len
_loop1:
mov eax, dword ptr [esi]
mov ebx, dword ptr [esi+4]
mov dword ptr [edi], eax
mov dword ptr [edi+ 4], ebx
mov eax, dword ptr [esi + 8]
mov ebx, dword ptr [esi + 12]
mov dword ptr [edi + 8], eax
mov dword ptr [edi + 12], ebx
add esi,16
add edi,16
dec ecx
jnz _loop1
pop edi
pop esi
}
#else // it doesnt know that ...
memcpy(litColor, color, (len<<2)*sizeof(Scalar));
#endif
#endif
//
//-----------------------------------
// Test each light against the vertex
//-----------------------------------
//
for (i=0;i<nrLights;i++)
{
MLRLight *light = lights[i];
Check_Object(light);
vertexData.point = &coords[0];
vertexData.color = &litColors[0];
vertexData.normal = &normals[0];
for(k=0;k<len;k++)
{
light->LightVertex(vertexData);
vertexData.point++;
vertexData.color++;
vertexData.normal++;
}
}
#ifdef LAB_ONLY
Statistics::MLR_LitVertices += len*nrLights;
#endif
// set the to use colors to the original colors ...
// only lighting could overwrite this;
actualColors = &litColors;
}
break;
case MLRState::LightingLightMapOnlyMode:
{
Verify(state.GetAlphaMode() == MLRState::OneZeroMode);
STOP(("Lightmaps not implemented yet."));
}
break;
case MLRState::LightingClassicAndLightMapMode:
{
Verify(state.GetAlphaMode() == MLRState::OneZeroMode);
Verify(colors.GetLength() == litColors.GetLength());
Verify(normals.GetLength() == colors.GetLength());
Verify(coords.GetLength() == colors.GetLength());
int i, k, len = colors.GetLength();
MLRVertexData vertexData;
#if COLOR_AS_DWORD
#else
RGBAColor *color = &colors[0];
RGBAColor *litColor = &litColors[0];
#if USE_ASSEMBLER_CODE
_asm {
push esi
push edi
mov esi, color
mov edi, litColor
mov ecx, len
_loop2:
mov eax, dword ptr [esi]
mov ebx, dword ptr [esi+4]
mov dword ptr [edi], eax
mov dword ptr [edi+ 4], ebx
mov eax, dword ptr [esi + 8]
mov ebx, dword ptr [esi + 12]
mov dword ptr [edi + 8], eax
mov dword ptr [edi + 12], ebx
add esi,16
add edi,16
dec ecx
jnz _loop2
pop edi
pop esi
}
#else // it doesnt know that ...
memcpy(litColor, color, (len<<2)*sizeof(Scalar));
#endif
#endif
//
//-----------------------------------
// Test each light against the vertex
//-----------------------------------
//
for (i=0;i<nrLights;i++)
{
MLRLight *light = lights[i];
Check_Object(light);
vertexData.point = &coords[0];
vertexData.color = &litColors[0];
vertexData.normal = &normals[0];
for(k=0;k<len;k++)
{
light->LightVertex(vertexData);
vertexData.point++;
vertexData.color++;
vertexData.normal++;
}
}
#ifdef LAB_ONLY
Statistics::MLR_LitVertices += len*nrLights;
#endif
// set the to use colors to the original colors ...
// only lighting could overwrite this;
actualColors = &litColors;
STOP(("Lightmaps not implemented yet."));
}
break;
}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
MLRPrimitive::PaintMe(const Stuff::RGBAColor *paintMe)
{
Check_Object(this);
Verify(colors.GetLength() == litColors.GetLength());
int k, len = litColors.GetLength();
#if COLOR_AS_DWORD
DWORD argb = GOSCopyColor(paintMe);
for(k=0;k<len;k++)
{
litColors[k] = argb;
}
#else
for(k=0;k<len;k++)
{
litColors[k] = *paintMe;
}
#endif
// set the to use colors to the original colors ...
// only lighting could overwrite this;
actualColors = &litColors;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
bool
MLRPrimitive::CastRay(
Line3D *line,
Normal3D *normal
)
{
Check_Object(this);
Check_Object(line);
Check_Pointer(normal);
STOP(("Not implemented"));
return false;
}
//#############################################################################
//####################### MLRPrimitive__ClassData #######################
//#############################################################################
void
MLRPrimitive__ClassData::TestInstance()
{
Verify(IsDerivedFrom(MLRPrimitive::DefaultData));
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -