示例#1
0
bool Terrain_DragScale( terrainMesh_t *p, vec3_t vAmt, vec3_t vMove ) {
	vec3_t	vMin;
	vec3_t	vMax;
	vec3_t	vScale;
	vec3_t	vTemp;
	vec3_t	vMid;
	int		i;

	Terrain_CalcBounds( p, vMin, vMax );

	VectorSubtract( vMax, vMin, vTemp );

	// if we are scaling in the same dimension the terrain has no depth
	for( i = 0; i < 3; i++ ) {
		if ( ( vTemp[ i ] == 0 ) && ( vMove[ i ] != 0 ) ) {
			return false;
		}
	}
  
	for( i = 0; i < 3; i++ ) {
		vMid[ i ] = ( vMin[ i ] + vMax[ i ] ) / 2;
	}

	for( i = 0; i < 3; i++ ) {
		if ( vAmt[ i ] != 0 ) {
			vScale[i] = 1.0 + vAmt[i] / vTemp[i];
		} else {
			vScale[i] = 1.0;
		}
	}

	Terrain_Scale( p, vMid, vScale, false );
	VectorSubtract( vMax, vMin, vTemp );
	Terrain_CalcBounds( p, vMin, vMax );
  	VectorSubtract( vMax, vMin, vMid );
	VectorSubtract( vMid, vTemp, vTemp );
	VectorScale( vTemp, 0.5f, vTemp );

	// abs of both should always be equal
	if ( !VectorCompare( vMove, vAmt ) ) {
		for( i = 0; i < 3; i++ ) {
			if ( vMove[ i ] != vAmt[ i ] ) {
				vTemp[ i ] = -vTemp[ i ];
			}
		}
	}

	Terrain_CalcNormals( p );
	Terrain_Move( p, vTemp );

	return true;
}
示例#2
0
void Select_Scale(float x, float y, float z)
{
	Select_GetMid (select_origin);
	for (brush_t* b=selected_brushes.next ; b != &selected_brushes ; b=b->next)
	{
		for (face_t* f=b->brush_faces ; f ; f=f->next)
		{
			for (int i=0 ; i<3 ; i++)
			{
				f->planepts[i][0] -= select_origin[0];
				f->planepts[i][1] -= select_origin[1];
				f->planepts[i][2] -= select_origin[2];
				f->planepts[i][0] *= x;
				//f->planepts[i][0] = floor(f->planepts[i][0] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;

				f->planepts[i][1] *= y;
				//f->planepts[i][1] = floor(f->planepts[i][1] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;

				f->planepts[i][2] *= z;
				//f->planepts[i][2] = floor(f->planepts[i][2] / g_qeglobals.d_gridsize + 0.5) * g_qeglobals.d_gridsize;

				f->planepts[i][0] += select_origin[0];
				f->planepts[i][1] += select_origin[1];
				f->planepts[i][2] += select_origin[2];
			}
		}
		Brush_Build(b, false);
		if (b->patchBrush)
		{
			vec3_t v;
			v[0] = x;
			v[1] = y;
			v[2] = z;
			//Patch_Scale(b->nPatchID, select_origin, v);
			Patch_Scale(b->pPatch, select_origin, v);
		}
		if (b->terrainBrush)
		{
			vec3_t v;
			v[0] = x;
			v[1] = y;
			v[2] = z;
			Terrain_Scale(b->pTerrain, select_origin, v);
		}
	}
}