public class Assembly {
	Assembly assemblies[];
	Shape3D shapes[];

	public void addAssembly() {
		if (assemblies == null) {
			assemblies = new Assembly[1];
		} else {
			Assembly temp[] = new Assembly[assemblies.length + 1];
			for (int i = 0; i < temp.length - 1; i++) {
				temp[i] = assemblies[i];
			}

			assemblies = new Assembly[temp.length];
			for (int i = 0; i < assemblies.length - 1; i++) {
				assemblies[i] = temp[i];
			}
		}
		assemblies[assemblies.length - 1] = new Assembly();
	}

	public void addShape3D() {
		if (shapes == null) {
			shapes = new Shape3D[1];
		} else {
			Shape3D temp[] = new Shape3D[shapes.length + 1];
			for (int i = 0; i < temp.length - 1; i++) {
				temp[i] = shapes[i];
			}

			shapes = new Shape3D[temp.length];
			for (int i = 0; i < shapes.length - 1; i++) {
				shapes[i] = temp[i];
			}
		}
		shapes[shapes.length - 1] = new Shape3D();
	}

	public void identityMatrix() {
		if (assemblies != null) {
			for (int i = 0; i < assemblies.length; i++) {
				assemblies[i].identityMatrix();
			}
		}

		if (shapes != null) {
			for (int i = 0; i < shapes.length; i++) {
				shapes[i].M.identityMatrix();
			}
		}
	}

	public void translate(double a, double b, double c) {
		if (assemblies != null) {
			for (int i = 0; i < assemblies.length; i++) {
				assemblies[i].translate(a, b, c);
			}
		}

		if (shapes != null) {
			for (int i = 0; i < shapes.length; i++) {
				shapes[i].M.translate(a, b, c);
			}
		}
	}

	public void rotateX(double theta) {
		if (assemblies != null) {
			for (int i = 0; i < assemblies.length; i++) {
				assemblies[i].rotateX(theta);
			}
		}

		if (shapes != null) {
			for (int i = 0; i < shapes.length; i++) {
				shapes[i].M.rotateX(theta);
			}
		}
	}

	public void rotateY(double theta) {
		if (assemblies != null) {
			for (int i = 0; i < assemblies.length; i++) {
				assemblies[i].rotateY(theta);
			}
		}

		if (shapes != null) {
			for (int i = 0; i < shapes.length; i++) {
				shapes[i].M.rotateY(theta);
			}
		}
	}

	public void rotateZ(double theta) {
		if (assemblies != null) {
			for (int i = 0; i < assemblies.length; i++) {
				assemblies[i].rotateZ(theta);
			}
		}

		if (shapes != null) {
			for (int i = 0; i < shapes.length; i++) {
				shapes[i].M.rotateZ(theta);
			}
		}
	}

	public void scale(double a, double b, double c) {
		if (assemblies != null) {
			for (int i = 0; i < assemblies.length; i++) {
				assemblies[i].scale(a, b, c);
			}
		}

		if (shapes != null) {
			for (int i = 0; i < shapes.length; i++) {
				shapes[i].M.scale(a, b, c);
			}
		}
	}

	public void multiply(Matrix3D M) {
		if (assemblies != null) {
			for (int i = 0; i < assemblies.length; i++) {
				assemblies[i].multiply(M);
			}
		}

		if (shapes != null) {
			for (int i = 0; i < shapes.length; i++) {
				shapes[i].M.multiply(M);
			}
		}
	}
}

