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; }
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); } } }