text:
/*************************************************************************/
/*  skeleton_2d.cpp                                                      */
/*************************************************************************/
/*                       This file is part of:                           */
/*                           GODOT ENGINE                                */
/*                      https://godotengine.org                          */
/*************************************************************************/
/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur.                 */
/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md).   */
/*                                                                       */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the       */
/* "Software"), to deal in the Software without restriction, including   */
/* without limitation the rights to use, copy, modify, merge, publish,   */
/* distribute, sublicense, and/or sell copies of the Software, and to    */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions:                                             */
/*                                                                       */
/* The above copyright notice and this permission notice shall be        */
/* included in all copies or substantial portions of the Software.       */
/*                                                                       */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,       */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF    */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY  */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,  */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE     */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.                */
/*************************************************************************/

#include "skeleton_2d.h"

#ifdef TOOLS_ENABLED
#include "editor/editor_data.h"
#include "editor/editor_settings.h"
#include "editor/plugins/canvas_item_editor_plugin.h"
#endif //TOOLS_ENABLED

bool Bone2D::_set(const StringName &p_path, const Variant &p_value) {
	String path = p_path;

	if (path.begins_with("auto_calculate_length_and_angle")) {
		set_autocalculate_length_and_angle(p_value);
	} else if (path.begins_with("length")) {
		set_length(p_value);
	} else if (path.begins_with("bone_angle")) {
		set_bone_angle(Math::deg_to_rad(real_t(p_value)));
	} else if (path.begins_with("default_length")) {
		set_length(p_value);
	}

#ifdef TOOLS_ENABLED
	if (path.begins_with("editor_settings/show_bone_gizmo")) {
		_editor_set_show_bone_gizmo(p_value);
	}
#endif // TOOLS_ENABLED

	return true;
}

bool Bone2D::_get(const StringName &p_path, Variant &r_ret) const {
	String path = p_path;

	if (path.begins_with("auto_calculate_length_and_angle")) {
		r_ret = get_autocalculate_length_and_angle();
	} else if (path.begins_with("length")) {
		r_ret = get_length();
	} else if (path.begins_with("bone_angle")) {
		r_ret = Math::rad_to_deg(get_bone_angle());
	} else if (path.begins_with("default_length")) {
		r_ret = get_length();
	}

#ifdef TOOLS_ENABLED
	if (path.begins_with("editor_settings/show_bone_gizmo")) {
		r_ret = _editor_get_show_bone_gizmo();
	}
#endif // TOOLS_ENABLED

	return true;
}

void Bone2D::_get_property_list(List<PropertyInfo> *p_list) const {
	p_list->push_back(PropertyInfo(Variant::BOOL, PNAME("auto_calculate_length_and_angle"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT));
	if (!autocalculate_length_and_angle) {
		p_list->push_back(PropertyInfo(Variant::FLOAT, PNAME("length"), PROPERTY_HINT_RANGE, "1, 1024, 1", PROPERTY_USAGE_DEFAULT));
		p_list->push_back(PropertyInfo(Variant::FLOAT, PNAME("bone_angle"), PROPERTY_HINT_RANGE, "-360, 360, 0.01", PROPERTY_USAGE_DEFAULT));
	}

#ifdef TOOLS_ENABLED
	p_list->push_back(PropertyInfo(Variant::BOOL, PNAME("editor_settings/show_bone_gizmo"), PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT));
#endif // TOOLS_ENABLED
}

void Bone2D::_notification(int p_what) {
	switch (p_what) {
		case NOTIFICATION_ENTER_TREE: {
			Node *parent = get_parent();
			parent_bone = Object::cast_to<Bone2D>(parent);
			skeleton = nullptr;
			while (parent) {
				skeleton = Object::cast_to<Skeleton2D>(parent);
				if (skeleton) {
					break;
				}
				if (!Object::cast_to<Bone2D>(parent)) {
					break; //skeletons must be chained to Bone2Ds.
				}

				parent = parent->get_parent();
			}

			if (skeleton) {
				Skeleton2D::Bone bone;
				bone.bone = this;
				skeleton->bones.push_back(bone);
				skeleton->_make_bone_setup_dirty();
			}

			cache_transform = get_transform();
			copy_transform_to_cache = true;

#ifdef TOOLS_ENABLED
			// Only draw the gizmo in the editor!
			if (Engine::get_singleton()->is_editor_hint() == false) {
				return;
			}

			queue_redraw();
#endif // TOOLS_ENABLED
		} break;

		case NOTIFICATION_LOCAL_TRANSFORM_CHANGED: {
			if (skeleton) {
				skeleton->_make_transform_dirty();
			}
			if (copy_transform_to_cache) {
				cache_transform = get_transform();
			}
#ifdef TOOLS_ENABLED
			// Only draw the gizmo in the editor!
			if (Engine::get_singleton()->is_editor_hint() == false) {
				return;
			}

			queue_redraw();

			if (get_parent()) {
				Bone2D *parent_bone = Object::cast_to<Bone2D>(get_parent());
				if (parent_bone) {
					parent_bone->queue_redraw();
				}
			}
#endif // TOOLS_ENABLED
		} break;

		case NOTIFICATION_MOVED_IN_PARENT: {
			if (skeleton) {
				skeleton->_make_bone_setup_dirty();
			}
			if (copy_transform_to_cache) {
				cache_transform = get_transform();
			}
		} break;

		case NOTIFICATION_EXIT_TREE: {
			if (skeleton) {
				for (int i = 0; i < skeleton->bones.size(); i++) {
					if (skeleton->bones[i].bone == this) {
						skeleton->bones.remove_at(i);
						break;
					}
				}
				skeleton->_make_bone_setup_dirty();
				skeleton = nullptr;
			}
			parent_bone = nullptr;
			set_transform(cache_transform);
		} break;

		case NOTIFICATION_READY: {
			if (autocalculate_length_and_angle) {
				calculate_length_and_rotation();
			}
		} break;

#ifdef TOOLS_ENABLED
		case NOTIFICATION_EDITOR_PRE_SAVE:
		case NOTIFICATION_EDITOR_POST_SAVE: {
			Transform2D tmp_trans = get_transform();
			set_transform(cache_transform);
			cache_transform = tmp_trans;
		} break;

		// Bone2D Editor gizmo drawing:
#ifndef _MSC_VER
#warning TODO Bone2D gizmo drawing needs to be moved to an editor plugin
#endif
		case NOTIFICATION_DRAW: {
			// Only draw the gizmo in the editor!
			if (Engine::get_singleton()->is_editor_hint() == false) {
				return;
			}

			if (editor_gizmo_rid.is_null()) {
				editor_gizmo_rid = RenderingServer::get_singleton()->canvas_item_create();
				RenderingServer::get_singleton()->canvas_item_set_parent(editor_gizmo_rid, get_canvas_item());
				RenderingServer::get_singleton()->canvas_item_set_z_as_relative_to_parent(editor_gizmo_rid, true);
				RenderingServer::get_singleton()->canvas_item_set_z_index(editor_gizmo_rid, 10);
			}
			RenderingServer::get_singleton()->canvas_item_clear(editor_gizmo_rid);

			if (!_editor_show_bone_gizmo) {
				return;
			}

			// Undo scaling
			Transform2D editor_gizmo_trans = Transform2D();
			editor_gizmo_trans.set_scale(Vector2(1, 1) / get_global_scale());
			RenderingServer::get_singleton()->canvas_item_set_transform(editor_gizmo_rid, editor_gizmo_trans);

			Color bone_color1 = EditorSettings::get_singleton()->get("editors/2d/bone_color1");
			Color bone_color2 = EditorSettings::get_singleton()->get("editors/2d/bone_color2");
			Color bone_ik_color = EditorSettings::get_singleton()->get("editors/2d/bone_ik_color");
			Color bone_outline_color = EditorSettings::get_singleton()->get("editors/2d/bone_outline_color");
			Color bone_selected_color = EditorSettings::get_singleton()->get("editors/2d/bone_selected_color");

			bool Bone2D_found = false;
			for (int i = 0; i < get_child_count(); i++) {
				Bone2D *child_node = nullptr;
				child_node = Object::cast_to<Bone2D>(get_child(i));
				if (!child_node) {
					continue;
				}
				Bone2D_found = true;

				Vector<Vector2> bone_shape;
				Vector<Vector2> bone_shape_outline;

				_editor_get_bone_shape(&bone_shape, &bone_shape_outline, child_node);

				Vector<Color> colors;
				if (has_meta("_local_pose_override_enabled_")) {
					colors.push_back(bone_ik_color);
					colors.push_back(bone_ik_color);
					colors.push_back(bone_ik_color);
					colors.push_back(bone_ik_color);
				} else {
					colors.push_back(bone_color1);
					colors.push_back(bone_color2);
					colors.push_back(bone_color1);
					colors.push_back(bone_color2);
				}

				Vector<Color> outline_colors;
				if (CanvasItemEditor::get_singleton()->editor_selection->is_selected(this)) {
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
				} else {
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
				}

				RenderingServer::get_singleton()->canvas_item_add_polygon(editor_gizmo_rid, bone_shape_outline, outline_colors);
				RenderingServer::get_singleton()->canvas_item_add_polygon(editor_gizmo_rid, bone_shape, colors);
			}

			if (!Bone2D_found) {
				Vector<Vector2> bone_shape;
				Vector<Vector2> bone_shape_outline;

				_editor_get_bone_shape(&bone_shape, &bone_shape_outline, nullptr);

				Vector<Color> colors;
				if (has_meta("_local_pose_override_enabled_")) {
					colors.push_back(bone_ik_color);
					colors.push_back(bone_ik_color);
					colors.push_back(bone_ik_color);
					colors.push_back(bone_ik_color);
				} else {
					colors.push_back(bone_color1);
					colors.push_back(bone_color2);
					colors.push_back(bone_color1);
					colors.push_back(bone_color2);
				}

				Vector<Color> outline_colors;
				if (CanvasItemEditor::get_singleton()->editor_selection->is_selected(this)) {
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
					outline_colors.push_back(bone_selected_color);
				} else {
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
					outline_colors.push_back(bone_outline_color);
				}

				RenderingServer::get_singleton()->canvas_item_add_polygon(editor_gizmo_rid, bone_shape_outline, outline_colors);
				RenderingServer::get_singleton()->canvas_item_add_polygon(editor_gizmo_rid, bone_shape, colors);
			}
		} break;
#endif // TOOLS_ENABLED
	}
}

#ifdef TOOLS_ENABLED
bool Bone2D::_editor_get_bone_shape(Vector<Vector2> *p_shape, Vector<Vector2> *p_outline_shape, Bone2D *p_other_bone) {
	int bone_width = EditorSettings::get_singleton()->get("editors/2d/bone_width");
	int bone_outline_width = EditorSettings::get_singleton()->get("editors/2d/bone_outline_size");

	if (!is_inside_tree()) {
		return false; //may have been removed
	}
	if (!p_other_bone && length <= 0) {
		return false;
	}

	Vector2 rel;
	if (p_other_bone) {
		rel = (p_other_bone->get_global_position() - get_global_position());
		rel = rel.rotated(-get_global_rotation()); // Undo Bone2D node's rotation so its drawn correctly regardless of the node's rotation
	} else {
		real_t angle_to_use = get_rotation() + bone_angle;
		rel = Vector2(cos(angle_to_use), sin(angle_to_use)) * (length * MIN(get_global_scale().x, get_global_scale().y));
		rel = rel.rotated(-get_rotation()); // Undo Bone2D node's rotation so its drawn correctly regardless of the node's rotation
	}

	Vector2 relt = rel.rotated(Math_PI * 0.5).normalized() * bone_width;
	Vector2 reln = rel.normalized();
	Vector2 reltn = relt.normalized();

	if (p_shape) {
		p_shape->clear();
		p_shape->push_back(Vector2(0, 0));
		p_shape->push_back(rel * 0.2 + relt);
		p_shape->push_back(rel);
		p_shape->push_back(rel * 0.2 - relt);
	}

	if (p_outline_shape) {
		p_outline_shape->clear();
		p_outline_shape->push_back((-reln - reltn) * bone_outline_width);
		p_outline_shape->push_back((-reln + reltn) * bone_outline_width);
		p_outline_shape->push_back(rel * 0.2 + relt + reltn * bone_outline_width);
		p_outline_shape->push_back(rel + (reln + reltn) * bone_outline_width);
		p_outline_shape->push_back(rel + (reln - reltn) * bone_outline_width);
		p_outline_shape->push_back(rel * 0.2 - relt - reltn * bone_outline_width);
	}
	return true;
}

void Bone2D::_editor_set_show_bone_gizmo(bool p_show_gizmo) {
	_editor_show_bone_gizmo = p_show_gizmo;
	queue_redraw();
}

bool Bone2D::_editor_get_show_bone_gizmo() const {
	return _editor_show_bone_gizmo;
}
#endif // TOOLS_ENABLED

void Bone2D::_bind_methods() {
	ClassDB::bind_method(D_METHOD("set_rest", "rest"), &Bone2D::set_rest);
	ClassDB::bind_method(D_METHOD("get_rest"), &Bone2D::get_rest);
	ClassDB::bind_method(D_METHOD("apply_rest"), &Bone2D::apply_rest);
	ClassDB::bind_method(D_METHOD("get_skeleton_rest"), &Bone2D::get_skeleton_rest);
	ClassDB::bind_method(D_METHOD("get_index_in_skeleton"), &Bone2D::get_index_in_skeleton);

	ClassDB::bind_method(D_METHOD("set_default_length", "default_length"), &Bone2D::set_default_length);
	ClassDB::bind_method(D_METHOD("get_default_length"), &Bone2D::get_default_length);

	ClassDB::bind_method(D_METHOD("set_autocalculate_length_and_angle", "auto_calculate"), &Bone2D::set_autocalculate_length_and_angle);
	ClassDB::bind_method(D_METHOD("get_autocalculate_length_and_angle"), &Bone2D::get_autocalculate_length_and_angle);
	ClassDB::bind_method(D_METHOD("set_length", "length"), &Bone2D::set_length);
	ClassDB::bind_method(D_METHOD("get_length"), &Bone2D::get_length);
	ClassDB::bind_method(D_METHOD("set_bone_angle", "angle"), &Bone2D::set_bone_angle);
	ClassDB::bind_method(D_METHOD("get_bone_angle"), &Bone2D::get_bone_angle);

	ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "rest", PROPERTY_HINT_NONE, "suffix:px"), "set_rest", "get_rest");
}

void Bone2D::set_rest(const Transform2D &p_rest) {
	rest = p_rest;
	if (skeleton) {
		skeleton->_make_bone_setup_dirty();
	}

	update_configuration_warnings();
}

Transform2D Bone2D::get_rest() const {
	return rest;
}

Transform2D Bone2D::get_skeleton_rest() const {
	if (parent_bone) {
		return parent_bone->get_skeleton_rest() * rest;
	} else {
		return rest;
	}
}

void Bone2D::apply_rest() {
	set_transform(rest);
}

void Bone2D::set_default_length(real_t p_length) {
	WARN_DEPRECATED_MSG("set_default_length is deprecated. Please use set_length instead!");
	set_length(p_length);
}

real_t Bone2D::get_default_length() const {
	WARN_DEPRECATED_MSG("get_default_length is deprecated. Please use get_length instead!");
	return get_length();
}

int Bone2D::get_index_in_skeleton() const {
	ERR_FAIL_COND_V(!skeleton, -1);
	skeleton->_update_bone_setup();
	return skeleton_index;
}

TypedArray<String> Bone2D::get_configuration_warnings() const {
	TypedArray<String> warnings = Node::get_configuration_warnings();
	if (!skeleton) {
		if (parent_bone) {
			warnings.push_back(RTR("This Bone2D chain should end at a Skeleton2D node."));
		} else {
			warnings.push_back(RTR("A Bone2D only works with a Skeleton2D or another Bone2D as parent node."));
		}
	}

	if (rest == Transform2D(0, 0, 0, 0, 0, 0)) {
		warnings.push_back(RTR("This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."));
	}

	return warnings;
}

void Bone2D::calculate_length_and_rotation() {
	// if there is at least a single child Bone2D node, we can calculate
	// the length and direction. We will always just use the first Bone2D for this.
	bool calculated = false;
	int child_count = get_child_count();
	if (child_count > 0) {
		for (int i = 0; i < child_count; i++) {
			Bone2D *child = Object::cast_to<Bone2D>(get_child(i));
			if (child) {
				Vector2 child_local_pos = to_local(child->get_global_position());
				length = child_local_pos.length();
				bone_angle = child_local_pos.normalized().angle();
				calculated = true;
				break;
			}
		}
	}
	if (calculated) {
		return; // Finished!
	} else {
		WARN_PRINT("No Bone2D children of node " + get_name() + ". Cannot calculate bone length or angle reliably.\nUsing transform rotation for bone angle");
		bone_angle = get_transform().get_rotation();
		return;
	}
}

void Bone2D::set_autocalculate_length_and_angle(bool p_autocalculate) {
	autocalculate_length_and_angle = p_autocalculate;
	if (autocalculate_length_and_angle) {
		calculate_length_and_rotation();
	}
	notify_property_list_changed();
}

bool Bone2D::get_autocalculate_length_and_angle() const {
	return autocalculate_length_and_angle;
}

void Bone2D::set_length(real_t p_length) {
	length = p_length;

#ifdef TOOLS_ENABLED
	queue_redraw();
#endif // TOOLS_ENABLED
}

real_t Bone2D::get_length() const {
	return length;
}

void Bone2D::set_bone_angle(real_t p_angle) {
	bone_angle = p_angle;

#ifdef TOOLS_ENABLED
	queue_redraw();
#endif // TOOLS_ENABLED
}

real_t Bone2D::get_bone_angle() const {
	return bone_angle;
}

Bone2D::Bone2D() {
	skeleton = nullptr;
	parent_bone = nullptr;
	skeleton_index = -1;
	length = 16;
	bone_angle = 0;
	autocalculate_length_and_angle = true;
	set_notify_local_transform(true);
	//this is a clever hack so the bone knows no rest has been set yet, allowing to show an error.
	for (int i = 0; i < 3; i++) {
		rest[i] = Vector2(0, 0);
	}
	copy_transform_to_cache = true;
}

Bone2D::~Bone2D() {
#ifdef TOOLS_ENABLED
	if (!editor_gizmo_rid.is_null()) {
		RenderingServer::get_singleton()->free(editor_gizmo_rid);
	}
#endif // TOOLS_ENABLED
}

//////////////////////////////////////

bool Skeleton2D::_set(const StringName &p_path, const Variant &p_value) {
	String path = p_path;

	if (path.begins_with("modification_stack")) {
		set_modification_stack(p_value);
		return true;
	}
	return true;
}

bool Skeleton2D::_get(const StringName &p_path, Variant &r_ret) const {
	String path = p_path;

	if (path.begins_with("modification_stack")) {
		r_ret = get_modification_stack();
		return true;
	}
	return true;
}

void Skeleton2D::_get_property_list(List<PropertyInfo> *p_list) const {
	p_list->push_back(
			PropertyInfo(Variant::OBJECT, PNAME("modification_stack"),
					PROPERTY_HINT_RESOURCE_TYPE,
					"SkeletonModificationStack2D",
					PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_DEFERRED_SET_RESOURCE | PROPERTY_USAGE_DO_NOT_SHARE_ON_DUPLICATE));
}

void Skeleton2D::_make_bone_setup_dirty() {
	if (bone_setup_dirty) {
		return;
	}
	bone_setup_dirty = true;
	if (is_inside_tree()) {
		call_deferred(SNAME("_update_bone_setup"));
	}
}

void Skeleton2D::_update_bone_setup() {
	if (!bone_setup_dirty) {
		return;
	}

	bone_setup_dirty = false;
	RS::get_singleton()->skeleton_allocate_data(skeleton, bones.size(), true);

	bones.sort(); //sorting so that they are always in the same order/index

	for (int i = 0; i < bones.size(); i++) {
		bones.write[i].rest_inverse = bones[i].bone->get_skeleton_rest().affine_inverse(); //bind pose
		bones.write[i].bone->skeleton_index = i;
		Bone2D *parent_bone = Object::cast_to<Bone2D>(bones[i].bone->get_parent());
		if (parent_bone) {
			bones.write[i].parent_index = parent_bone->skeleton_index;
		} else {
			bones.write[i].parent_index = -1;
		}

		bones.write[i].local_pose_override = bones[i].bone->get_skeleton_rest();
	}

	transform_dirty = true;
	_update_transform();
	emit_signal(SNAME("bone_setup_changed"));
}

void Skeleton2D::_make_transform_dirty() {
	if (transform_dirty) {
		return;
	}
	transform_dirty = true;
	if (is_inside_tree()) {
		call_deferred(SNAME("_update_transform"));
	}
}

void Skeleton2D::_update_transform() {
	if (bone_setup_dirty) {
		_update_bone_setup();
		return; //above will update transform anyway
	}
	if (!transform_dirty) {
		return;
	}

	transform_dirty = false;

	for (int i = 0; i < bones.size(); i++) {
		ERR_CONTINUE(bones[i].parent_index >= i);
		if (bones[i].parent_index >= 0) {
			bones.write[i].accum_transform = bones[bones[i].parent_index].accum_transform * bones[i].bone->get_transform();
		} else {
			bones.write[i].accum_transform = bones[i].bone->get_transform();
		}
	}

	for (int i = 0; i < bones.size(); i++) {
		Transform2D final_xform = bones[i].accum_transform * bones[i].rest_inverse;
		RS::get_singleton()->skeleton_bone_set_transform_2d(skeleton, i, final_xform);
	}
}

int Skeleton2D::get_bone_count() const {
	ERR_FAIL_COND_V(!is_inside_tree(), 0);

	if (bone_setup_dirty) {
		const_cast<Skeleton2D *>(this)->_update_bone_setup();
	}

	return bones.size();
}

Bone2D *Skeleton2D::get_bone(int p_idx) {
	ERR_FAIL_COND_V(!is_inside_tree(), nullptr);
	ERR_FAIL_INDEX_V(p_idx, bones.size(), nullptr);

	return bones[p_idx].bone;
}

void Skeleton2D::_notification(int p_what) {
	if (p_what == NOTIFICATION_READY) {
		if (bone_setup_dirty) {
			_update_bone_setup();
		}
		if (transform_dirty) {
			_update_transform();
		}
		request_ready();
	}

	if (p_what == NOTIFICATION_TRANSFORM_CHANGED) {
		RS::get_singleton()->skeleton_set_base_transform_2d(skeleton, get_global_transform());
	} else if (p_what == NOTIFICATION_INTERNAL_PROCESS) {
		if (modification_stack.is_valid()) {
			execute_modifications(get_process_delta_time(), SkeletonModificationStack2D::EXECUTION_MODE::execution_mode_process);
		}
	} else if (p_what == NOTIFICATION_INTERNAL_PHYSICS_PROCESS) {
		if (modification_stack.is_valid()) {
			execute_modifications(get_physics_process_delta_time(), SkeletonModificationStack2D::EXECUTION_MODE::execution_mode_physics_process);
		}
	}
#ifdef TOOLS_ENABLED
	else if (p_what == NOTIFICATION_DRAW) {
		if (Engine::get_singleton()->is_editor_hint()) {
			if (modification_stack.is_valid()) {
				modification_stack->draw_editor_gizmos();
			}
		}
	}
#endif // TOOLS_ENABLED
}

RID Skeleton2D::get_skeleton() const {
	return skeleton;
}

void Skeleton2D::set_bone_local_pose_override(int p_bone_idx, Transform2D p_override, real_t p_amount, bool p_persistent) {
	ERR_FAIL_INDEX_MSG(p_bone_idx, bones.size(), "Bone index is out of range!");
	bones.write[p_bone_idx].local_pose_override = p_override;
	bones.write[p_bone_idx].local_pose_override_amount = p_amount;
	bones.write[p_bone_idx].local_pose_override_persistent = p_persistent;
}

Transform2D Skeleton2D::get_bone_local_pose_override(int p_bone_idx) {
	ERR_FAIL_INDEX_V_MSG(p_bone_idx, bones.size(), Transform2D(), "Bone index is out of range!");
	return bones[p_bone_idx].local_pose_override;
}

void Skeleton2D::set_modification_stack(Ref<SkeletonModificationStack2D> p_stack) {
	if (modification_stack.is_valid()) {
		modification_stack->is_setup = false;
		modification_stack->set_skeleton(nullptr);

		set_process_internal(false);
		set_physics_process_internal(false);
	}
	modification_stack = p_stack;
	if (modification_stack.is_valid()) {
		modification_stack->set_skeleton(this);
		modification_stack->setup();

		set_process_internal(true);
		set_physics_process_internal(true);

#ifdef TOOLS_ENABLED
		modification_stack->set_editor_gizmos_dirty(true);
#endif // TOOLS_ENABLED
	}
}

Ref<SkeletonModificationStack2D> Skeleton2D::get_modification_stack() const {
	return modification_stack;
}

void Skeleton2D::execute_modifications(real_t p_delta, int p_execution_mode) {
	if (!modification_stack.is_valid()) {
		return;
	}

	// Do not cache the transform changes caused by the modifications!
	for (int i = 0; i < bones.size(); i++) {
		bones[i].bone->copy_transform_to_cache = false;
	}

	if (modification_stack->skeleton != this) {
		modification_stack->set_skeleton(this);
	}

	modification_stack->execute(p_delta, p_execution_mode);

	// Only apply the local pose override on _process. Otherwise, just calculate the local_pose_override and reset the transform.
	if (p_execution_mode == SkeletonModificationStack2D::EXECUTION_MODE::execution_mode_process) {
		for (int i = 0; i < bones.size(); i++) {
			if (bones[i].local_pose_override_amount > 0) {
				bones[i].bone->set_meta("_local_pose_override_enabled_", true);

				Transform2D final_trans = bones[i].bone->cache_transform;
				final_trans = final_trans.interpolate_with(bones[i].local_pose_override, bones[i].local_pose_override_amount);
				bones[i].bone->set_transform(final_trans);
				bones[i].bone->propagate_call("force_update_transform");

				if (bones[i].local_pose_override_persistent) {
					bones.write[i].local_pose_override_amount = 0.0;
				}
			} else {
				// TODO: see if there is a way to undo the override without having to resort to setting every bone's transform.
				bones[i].bone->remove_meta("_local_pose_override_enabled_");
				bones[i].bone->set_transform(bones[i].bone->cache_transform);
			}
		}
	}

	// Cache any future transform changes
	for (int i = 0; i < bones.size(); i++) {
		bones[i].bone->copy_transform_to_cache = true;
	}

#ifdef TOOLS_ENABLED
	modification_stack->set_editor_gizmos_dirty(true);
#endif // TOOLS_ENABLED
}

void Skeleton2D::_bind_methods() {
	ClassDB::bind_method(D_METHOD("_update_bone_setup"), &Skeleton2D::_update_bone_setup);
	ClassDB::bind_method(D_METHOD("_update_transform"), &Skeleton2D::_update_transform);

	ClassDB::bind_method(D_METHOD("get_bone_count"), &Skeleton2D::get_bone_count);
	ClassDB::bind_method(D_METHOD("get_bone", "idx"), &Skeleton2D::get_bone);

	ClassDB::bind_method(D_METHOD("get_skeleton"), &Skeleton2D::get_skeleton);

	ClassDB::bind_method(D_METHOD("set_modification_stack", "modification_stack"), &Skeleton2D::set_modification_stack);
	ClassDB::bind_method(D_METHOD("get_modification_stack"), &Skeleton2D::get_modification_stack);
	ClassDB::bind_method(D_METHOD("execute_modifications", "delta", "execution_mode"), &Skeleton2D::execute_modifications);

	ClassDB::bind_method(D_METHOD("set_bone_local_pose_override", "bone_idx", "override_pose", "strength", "persistent"), &Skeleton2D::set_bone_local_pose_override);
	ClassDB::bind_method(D_METHOD("get_bone_local_pose_override", "bone_idx"), &Skeleton2D::get_bone_local_pose_override);

	ADD_SIGNAL(MethodInfo("bone_setup_changed"));
}

Skeleton2D::Skeleton2D() {
	skeleton = RS::get_singleton()->skeleton_create();
	set_notify_transform(true);
}

Skeleton2D::~Skeleton2D() {
	RS::get_singleton()->free(skeleton);
}

redpajama_set_name: RedPajamaGithub


Vistisen, P., Folmann, B., Sørensen, K. B. & Bruun, M. H.
Madsen, K. M. & Vistisen, P., 2019, (Accepted/In press) Proceedings of the 13th European Academy of Design Conference. 15 p.
Kan KvanteKarina sparke døren op til fysikforståelsen?


Once household chores and money rules have been firmly established, it is time to look outside the home for work (volunteer) opportunities. While you're seeking out those opportunities, you can try this little strategy I call "guerilla volunteering". While in the community, look for small pieces of helpful but casual work your child can do: restoring order to the spice display, making sure all the soup cans face out, ensuring the library's videos are in alphabetical order. In the very early days you might want to secretly create a small amount of disorder that your child can correct quickly and easily, so the job doesn't become overwhelming and then gradually have them deal with larger tasks.
Be sure your child's teacher knows about your child's growing capabilities. Ask for work-type responsibilities to be given at school, whether that's taking attendance to the office or setting up/cleaning up for a specific activity.
Your child can do (in full or in part): this might mean developing skills beyond those of household chores: see the resource suggestion at the end of this article.
Align with your child's interests: e.g. would they rather work with food items or hardware items?
Align with your child's strengths: e.g. are they able to perform fine motor tasks or are they better at ones that require less precision?
Take place in a setting your child can tolerate: e.g. are they able to tolerate noise or prefer quiet environments? Are they more comfortable working outdoors or indoors?
Take place in a setting your child is familiar with. This ensures that a new task isn't made more complicated by requiring it to be done in an unfamiliar setting. This is particularly important for the first volunteer job.
Require a degree of inter-personal interaction your child is comfortable with: e.g. can they give directions to strangers, are they better face-to-face or on the phone, do they need to communicate non-verbally?
Can provide the accommodations your child needs: e.g. wearing headphones, having labels added to environment, having the workplace organized differently.
Ask your child's teachers, recreation supervisors, support workers, etc. to suggest types of volunteer work that might suit and engage your child.
Local stores or businesses, particularly those that have local ownership or management.
Local services (community newspapers, recreation centers, social service providers).
Any place your family or friends work.
Any place offering services your family or friends use (recreation center, seniors' center, church, day care, sports club, school, yoga studio, gym). To avoid confusion around roles, avoid places with which your child is currently engaged as a participant.
As with chores, try to choose work that is repeated, rather than a one-time event: it's generally better to deliver the community paper every two weeks than to deliver flyers for an annual fundraising event. Also, as with chores, look for work that aligns with your child's interests and that can be accomplished relatively easily, to increase comfort and confidence.
Decide how your child will be compensated for their work. We pay more for work done outside the home than for chores, and sometimes pair a reward with the location of the work (e.g. a visit to a store or restaurant near to the "work" place).
Charity Village and/or your local volunteer banks often post volunteer positions online. Although these postings may frequently be for jobs beyond your child's abilities, and often are for one-time events, it's still worth pursuing them. For example, a volunteer job distributing flyers for a community agency's annual celebration led to them calling on my son whenever they need flyers distributed for other events. In another case, 90 minutes of volunteer work one Christmas has led to a coop job opportunity that will be supported through my son's school: an opportunity we would have never found if we hadn't pursued that first volunteer posting.
Watch for opportunities wherever you go – your instincts will usually tell you when you've encountered a suitable environment and, even more importantly, people with the compassion, interest, and attitude to make a job work for your child.
If possible, have someone other than the parent accompany the child to his or her volunteer work: that will make the separation of work from home clearer. A respite worker is a good option, as is another caregiver, a responsible friend, or even a sibling.
Take the time to educate whomever your child will be working with about ASD in general, your child in particular, and the strategies and supports they need. Don't be afraid to ask for what needs to be adjusted, and set expectations appropriately: it is better that the "employer" be pleasantly surprised than disappointed. Watch out for the well-meaning supervisor who takes pity on your child and steps in to take over the work or accepts minimal performance: that attitude will not be helpful for your child in the long run.
The books "Tasks Galore" and "Tasks Galore at Work" are visual, creative guides to setting up in-home training that can help develop and practice job skills (e.g. assembling, filing, and sorting). See http://www.tasksgalore.com/ for details or these volumes might be available from your school or local service provider.


text:
var PropertyValueSet = require('./PropertyValueSet');

/**
 * Takes an array of Game Objects, or any objects that have the public property `y`
 * and then sets it to the given value.
 *
 * The optional `step` property is applied incrementally, multiplied by each item in the array.
 *
 * To use this with a Group: `SetY(group.getChildren(), value, step)`
 *
 * @function Phaser.Actions.SetY
 * @since 3.0.0
 *
 * @generic {Phaser.GameObjects.GameObject[]} G - [items,$return]
 *
 * @param {(array|Phaser.GameObjects.GameObject[])} items - The array of items to be updated by this action.
 * @param {number} value - The amount to set the property to.
 * @param {number} [step=0] - This is added to the `value` amount, multiplied by the iteration counter.
 * @param {integer} [index=0] - An optional offset to start searching from within the items array.
 * @param {integer} [direction=1] - The direction to iterate through the array. 1 is from beginning to end, -1 from end to beginning.
 *
 * @return {(array|Phaser.GameObjects.GameObject[])} The array of objects that were passed to this Action.
 */
var SetY = function (items, value, step, index, direction)
{
    return PropertyValueSet(items, 'y', value, step, index, direction);
};

module.exports = SetY;


text:
Trevork Noah Tickets
We're Alexa-Enabled
Get the Alt 95.7 App
The Best Hard Rock Album of Each Year Since 1970
Loudwire Staff Updated: April 19, 2017
Reprise / Warner Bros. / DGC / Geffen / Columbia
Rock 'n' roll is a wide ranging term that has seen many different evolutions over the years, but by the time 1970 came around you could start to see acts that weren't just content with the catchy ditties that populated radio in the '50s and early '60s. A harder sound had emerged and its there we find our focus for this list, recounting the Best Hard Rock Album of Each Year Since 1970.
Even these hard rock sounds branched off in different directions, from the guitar-centric rock of the early '70s into the evolution of the punk movement. By the time the '80s came around, we saw metal spin off of a more radio ready version of rock. At the end of the era, you began to see things branch out even further with industrial rock also making its presence felt. The '90s saw a grittier version of hard rock labeled grunge dominating the early part of the era, while elements of more beat-driven music yielded the nu metal era of the late '90s and early 2000s.
But regardless of labels, it all comes together in one aggressive melting pot known as hard rock. So scroll through the gallery below and see which albums helped to shape rock as we know it as we explore the Best Hard Rock Album of Each Year Since 1970.
And if you're wondering why you don't see any metal albums of this list, that's because we already did a separate one on just metal. Click here to see that list.
To keep up with all the latest rock and metal music, follow Loudwire's 'Weekly Wire' playlist, updated with 50 new songs each Friday.
Going year by year, looking at the best albums in hard rock since 1970.
The Best Metal Album of Each Year Since 1970
See Loudwire's picks for the Best Metal Album of Each Year Since 1970
Source: The Best Hard Rock Album of Each Year Since 1970
Filed Under: Alice in Chains, Bad Omens, Chevelle, Deftones, Disturbed, Green Day, Guns N' Roses, Led Zeppelin, Nine Inch Nails, Nirvana, Van Halen
More From Alt 95.7
25 Important Rock + Metal Albums Turning 10 in 2023
Courtney Love Wrote a Song Called 'Justice for Kurt' But Thinks It Would 'Ruin' Her Upcoming Album
11 Ways Metal + Pop Really Aren't That Different
Study Shows Which Rock + Metal Songs' Lyrics Are Most Often Misheard
How Nirvana's 1992 Reading Set Went From 'Disaster' to 'Beautiful'
Nirvana Messing With Interviewers
The Most-Replayed Scenes From the 20 Most Popular Rock + Metal Music Videos
Rock Songs That Became Popular (or More Popular) After Being Featured on TV Shows + Movies
Missoula Business Listings
2023 alt 95.7, Townsquare Media, Inc. All rights reserved.

redpajama_set_name: RedPajamaCommonCrawl


Categories: Security & Safety, Specials & Gadgets.
Wireless charging. Water- and dust-resistant. Pre-Order now!
The world's smallest all-in-one tracking device that features global tracking and up to 2-months battery life on one charge.
Press the SOS button for 5 seconds and iTraq Nano will send an instant alert to family and friends, notifying them of the precise location.
Recharging iTraq Nano is simple: just place it on top of the Wireless Charger and your iTraq will soon be charged again.
iTraq Nano can be easily attached to your child's backpack or your loved one's purse or belt. Enjoy peace of mind when the most important people are out of your sight.
With this specially-designed bicycle reflector, you can hide your iTraq Nano in plain view. Bike thieves won't stand a chance! Track down your bike instantly if it is lost or stolen.
Reports accurate location from both, outdoors and indoors.
Supports: GPS, GLONASS, Cellular, Wi-Fi, iBeacon microlocation.
SOS Button: Sends instant message with your location information to your family or friends when button is pressed.
Battery Life: Up to 60 days for reports set for one per day.
Guard Mode: Sends alerts when iTraq enters or leaves the guarded area.
Global SIM Card: Comes with ready to use global SIM card.
Accelerometer: detects different types of motion; can be tuned to report when motion or fall are detected.


What is Warren Ellis on?
China began designing their own superhuman soon after, but didn't have the tech for Megareactor Buddha's Spine until 1990. Nominally, PRC is atheist, but the old religions never went away, and a surprising number of Chinese state scientists still think in terms of qi. The superhuman Maitreya was a subject enveloped by scanning tunnelling microscopes wired into his visual cortex, forced to meditate upon his own atomic structure until he could perceive the quantum foam of every particle of his being birthing and annihilating under the uncertainty principle. His emergence into superhumanity was heralded by the impossible light of zero point energy accessed from the spaces between virtual particles. The Chinese filled a warehouse with political prisoners and told Maitreya to kill them, to demonstrate his power over spacetime and matter. He instead fashioned them into a vast musical instrument of entrancingly beautiful tone. Then configured all the assembled soldiers and scientists into a self-supporting worm-like structure and fired them into space with/through the musical instrument, where they journeyed as a biological probe of brains linked in parallel that reported information about the solar system back to Maitreya via quantum entanglement until the structure, starting to break up, was identified as comet Shoemaker-Levy and eventually smacked into the surface of Jupiter.


text:
2008-UP-545 - Quick v. Markel Insurance Company
Amy Carol Quick and Betty Quick, Appellants
Markel Insurance Company and the Chesterfield County School District, Respondents.
Appeal From Chesterfield County
James E. Lockemy, Circuit Court Judge
Heard November 6, 2007 – Filed October 3, 2008
Martin S. Driggers, Sr., of Hartsville; William O. Sweeny, III, and William R. Calhoun, both of Columbia, for Appellants.
Kenneth L. Childs, Allen D. Smith, and Allison Aiken Hanna of Columbia; Michael A. Nunn and Benjamin A. Baroody, both of Florence; for Respondents.
PER CURIAM: Betty and Amy Quick[1] appeal the trial judge's grant of summary judgment to Markel Insurance Company (Markel) and the Chesterfield County School District (District). We affirm.
Markel issued to the District a blanket accident and health insurance policy. Under this policy, students could obtain insurance coverage. One insurance plan provided coverage for a student during school hours during the school year while another plan covered a student 24 hours a day for an entire year. The District collected and transmitted the students' insurance payments to Markel. At the beginning of the 2000-2001 school year, Ms. Quick purchased the 24-hour insurance for Amy for a one-time premium of $39 while paying for other fees and expenses during the pre-registration process at Cheraw High School, a school located within the District.
Markel provided the school with brochures that explained the 24-hour policy's terms and exclusions. According to Markel and the District, these brochures were made available to people purchasing insurance during the pre-registration process and were given to students during homeroom to take home with them. The Quicks claim they never received any information on the policy from Markel and were not provided a brochure explaining the coverage. Ms. Quick did not ask any questions about the 24-hour insurance policy. At the time she purchased insurance for her daughter, Ms. Quick only knew the Markel policy would cover Amy during the 2000-2001 school year, the policy provided "24-hour" coverage, and the policy was "comprehensive."[2]
On November 23, 2000, Amy was in an automobile accident while riding as a passenger in a vehicle driven by her boyfriend. She suffered significant injuries, including the loss of one eye and a broken femur. Amy incurred medical bills from the accident amounting to approximately $55,000. The 24-hour policy provided compensation of $2,500 for medical bills incurred as a result of the automobile accident and $5,000 for the loss of the eye. Markel paid the policy's limit of $7,500 to the Quicks.
The Quicks filed a lawsuit against Markel and the District, as Markel's agent, for breach of contract, negligent misrepresentation, and waiver and estoppel. In addition, the Quicks asserted a claim against Markel for insurance bad faith. They sought $75,000 in damages and attorney's fees. All of the parties filed motions for summary judgment. The trial court granted summary judgment to Markel and the District on the Quicks' claim for waiver and estoppel and to Markel on the bad faith claim. It denied summary judgment as to the causes of action for breach of contract and negligent misrepresentation against Markel and the District.
The Quicks filed their second amended complaint against Markel and the District asserting causes of action for breach of contract, negligent misrepresentation, and negligence. The parties again filed motions for summary judgment. The trial court granted summary judgment to Markel and the District on all three causes of action. It subsequently denied the Quicks' motion for reconsideration. This appeal followed.
The purpose of summary judgment is to expedite the disposition of cases that do not require the services of a fact finder. Dawkins v. Fields, 354 S.C. 58, 69, 580 S.E.2d 433, 438 (2003). Summary judgment is appropriate when there is no genuine issue as to any material fact and the moving party is entitled to judgment as a matter of law. Osborne v. Adams, 346 S.C. 4, 7, 550 S.E.2d 319, 321 (2001). The evidence and all reasonable inferences therefrom must be viewed in the light most favorable to the non-moving party. Id. "It is well established that summary judgment should be granted '. . . in cases in which plain, palpable and indisputable facts exist on which reasonable minds cannot differ.'" Anders v. S.C. Farm Bureau Mut. Ins. Co., 307 S.C. 371, 373, 415 S.E.2d 406, 407 (Ct. App. 1992) (quoting Main v. Corley, 281 S.C. 525, 526, 316 S.E.2d 406, 407 (1984)); see Bloom v. Ravoira, 339 S.C. 417, 425, 529 S.E.2d 710, 714 (2000) (finding where a verdict is not reasonably possible under the facts presented, summary judgment is proper).
LAW/ANALYSIS
The Quicks argue the trial court erred in granting summary judgment in favor of Markel and the District on their claim for negligence. We disagree.
In order to prove negligence, the Quicks must show: "(1) the defendant owed a duty of care to the plaintiff; (2) the defendant breached the duty by a negligent act or omission; (3) the defendant's breach was the actual and proximate cause of the plaintiff's injury; and (4) the plaintiff suffered an injury or damages." Doe v. Marion, 373 S.C. 390, 400, 645 S.E.2d 245, 250 (2007).
The trial court assumed for the purpose of summary judgment that the appellants did not actually receive Markel's brochure outlining the terms, conditions, and limitations of the blanket accident and health policy issued by it to the District. Instead, the trial court held Markel and the District did not have a duty to explain all of the risks and coverages to the Quicks. We agree with this holding.
It is important to note that this is a blanket accident and health policy, not an individual policy. Thus, according to statute, the District is the policyholder. S.C. Code Ann. § 38-71-1020. Section 38-71-1020 of the South Carolina Code incorporates the provisions for individual accident and health policies found in Article 3 of Chapter 71 into the provisions for blanket policies found in Article 9. S.C. Code Ann. § 38-71-1020 (2002) ("All blanket accident and health insurance policies are subject to the provision of Articles 1 and 3 of this chapter."). Section 38-71-550 of Article 3 requires an outline of coverage for an individual accident and health insurance policy to be "delivered to the applicant at the time application is made and an acknowledgment of receipt or certificate of delivery of the outline is provided the insured with the application." S.C. Code Ann. § 38-71-550(a) (2002) (emphasis added).[3] However, "[a]n individual application is not required from each individual covered under a blanket accident and health policy or contract nor is it necessary for the insurer to furnish each individual a certificate." S.C. Code Ann. § 1030 (2002).
The proper interpretation of a statute is a question of law for the court. Univ. of S. Cal. v. Moran, 365 S.C. 270, 274, 617 S.E. 2d 135, 137 (Ct. App. 2005). "The primary rule of statutory construction is to ascertain and give effect to the intent of the legislature." Mid-State Auto Auction of Lexington v. Altman, 324 S.C. 65, 69, 476 S.E.2d 690, 692 (1996). "[T]he words of the statute must be given their plain and ordinary meaning without resorting to subtle or forced construction to limit or expand the statute's operation." Mun. Ass'n of S.C. v. AT & T Communications of S. States, 361 S.C. 576, 580, 606 S.E.2d 468, 470 (2004). "Statutes, as a whole, must receive practical, reasonable, and fair interpretation, consonant with the purpose, design, and policy of lawmakers." TNS Mills v. S.C. Dep't of Revenue, 331 S.C. 611, 624, 503 S.E.2d 471, 478 (1998). Where a statute is ambiguous, the court must construe the terms of the statute and the ambiguity should be resolved in favor of a just, beneficial and equitable operation of the law. City of Camden v. Brassell, 326 S.C. 556, 561, 486 S.E.2d 492, 495 (Ct. App. 1997).
Clearly, the legislature did not intend the disclosure requirement of Section 38-71-550 to apply to an insured under a blanket policy when the requirement relates to disclosure at the time an application is made for insurance coverage or a policy of insurance is delivered and section 38-71-1030 specifically exempts individuals covered under a blanket policies from the application process or the requirement of delivery to each insured a certificate of insurance.
As we understand the policy at issue, the District may add insured students to the policy by collecting and paying over to Markel the required premiums and furnishing Markel the names of the students to be covered. No further acts were necessary to be done by Markel or the district to effect coverage of Amy Quick. We hold neither Markel nor the district violated any provision of Chapter 71 of Title 38 of the Code by not delivering a brochure to the Quicks at the time the premium was paid or at any other time.[4]
The Quicks assert that under the common law, Markel and the District had a duty to provide them with the terms of the policy. As this case involves a blanket policy and the District is the policy holder, Markel fulfilled any duty it might have by providing a copy of the blanket policy to the District. We hold the Quicks failed to prove the District or Markel owed any duty to them to directly provide them the terms of the insurance policy.
As the Quicks have failed to establish a duty owed to them, their claim for negligence must fail.
The Quicks assert the trial court erred in granting summary judgment on their negligent misrepresentation claim. We disagree.
To establish a claim for negligent misrepresentation, the Quicks must be able to prove the following elements:
(1) the defendant made a false representation to the plaintiff; (2) the defendant had a pecuniary interest in making the statement; (3) the defendant owed a duty of care to see that he communicated truthful information to the plaintiff; (4) the defendant breached that duty by failing to exercise due care; (5) the plaintiff justifiably relied on the representation; and (6) the plaintiff suffered a pecuniary loss as the proximate result of his reliance upon the representation.
AMA Mgmt. Corp. v. Strasburger, 309 S.C. 213, 222, 420 S.E.2d 868, 874 (Ct. App. 1992).
The Quicks claim Markel and the District made false representations in the letter from the District describing the policy as providing "comprehensive accident insurance at a nominal cost" and stating that it "ensured coverage for . . . normal day-to-day activities." The Quicks also take issue with the term "24-hour insurance" asserting the term has a connotation of completeness. Based on these statements, the Quicks assert there should be no limits on the coverage available under the policy.
However, none of these statements make any representations as to the amount of coverage available under the policy. They do not support the Quicks' assertion that they are entitled to limitless coverage. In fact, when asked what her understanding was of the level of coverage, Ms. Quick responded: "Actually, I didn't. I didn't know basically what it was going to cover or wasn't going to cover. I just – I know the word assume, but I assumed that was a good policy because the school was promoting it, so I didn't –and I had always taken out the 24-hour." Even if the Districts' statements could be construed as representing that this was a "good policy," the representations would not be actionable. "A mere statement of opinion, commendation of goods or services, or expression of confidence that a bargain will be satisfactory does not give rise to liability in tort." AMA Mgmt. Corp., 309 S.C. at 222, 420 S.E.2d at 874; see Winburn v. Ins. Co. of N. America, 287 S.C. 435, 440, 339 S.E.2d 142, 146 (Ct. App. 1985) (holding statement that a person was a "good mechanic" did not support a claim for fraud).
There is no evidence in the record of any misrepresentation as to the amount of coverage available in the policy. We therefore find no error in the trial court granting summary judgment in favor of Markel and the District on the Quicks' claim for negligent misrepresentation.
The Quicks argue the trial court erred in granting summary judgment on their claim for breach of contract. We disagree.
To recover for a claim for breach of contract, the Quicks must establish the contract, its breach, and the damages caused by such breach. Fuller v. E. Fire & Cas. Ins. Co., 240 S.C. 75, 89, 124 S.E.2d 602, 610 (1962). "Insurance policies are subject to the general rules of contract construction." Century Indem. Co. v. Golden Hills Builders, 348 S.C. 559, 565, 561 S.E.2d 355, 358 (2002). We must give the policy language its plain, ordinary, and popular meaning. Id. It is undisputed that under the terms of the policy, Amy was entitled to $7500.00 for her accident. It is also undisputed Markel paid Amy $7500.00, the full amount to which she was entitled under the terms of the policy.
The Quicks, however, assert the contract was in fact based on the only material she received, the letter stating the insurance provided "comprehensive" and "24-hour" coverage. Thus, they claim since their contract contained no limitation of coverage, there are no limits. The issue of reformation of the contract was never raised nor ruled on by the trial court. See Wilder Corp. v. Wilke, 330 S.C. 71, 76, 497 S.E.2d 731, 733 (1998) ("It is axiomatic that an issue cannot be raised for the first time on appeal, but must have been raised to and ruled upon by the trial judge to be preserved for appellate review."). The court viewed the insurance policy as written and found no breach of contract. We find no error in this ruling.
The order of the trial court granting summary judgment to Markel and the District is
HUFF and PIEPER, JJ., and CURETON, A.J., concur.
[1] Amy, whose date of birth is April 26, 1983, was no longer a minor at the of the filing of this action.
[2] A letter from the school district briefly explaining the insurance plans available for students mentioned the coverage was "comprehensive."
[3] The outline of coverage must include "a description of the principal benefits and coverage provided in the policy or contract" as well as "a statement of the exceptions, reductions, and limitations contained in the policy or contract." S.C. Code Ann. § 38-71-550(b) (2) & (3) (2002).
[4] Although the trial court did not address these statutes, we find a discussion of the statutes emphasizes the difference between a blanket policy and an individual policy and supports our conclusion no duty existed to provide the Quicks with the policy. I'On, L.L.C. v. Town of Mt. Pleasant, 338 S.C. 406, 420, 526 S.E.2d 716, 723 (2000) (stating the appellate court may rely on any reason appearing in the record to affirm the lower court's judgment).


Two scientists were at the heart of electricity's development as a technology.
Franklin was an American scientist, who during the 1700s, improved our understanding of electricity.
One famous, but extremely dangerous experiment that he performed was flying a kite in an electrical storm to prove that lightning was made from electricity.
The kite was flown into the storm, and a key was attached to the end of the string and attached to a Leyden Jar, a device that could store static electricity.
Fortunately for Franklin, the lightning never actually hit the kite (or he would have been most certainly killed), but enough static charge was built up on the string that he received an electric shock, proving that lightning was electrical.
Faraday was a British scientist who studied magnetic fields and electricity.
He noticed that passing electricity through a wire made a magnetic field.
This led to the development of the electric motor.
Faraday also designed the Faraday Cage, which blocks electricity from passing through anything inside it.
Today, Faraday cages are used by electrical workers to protect themselves from electrocution when they work on live power lines. They are also used to block cell phone signals!


Tuesday, March 31st, 2009 will be a busy one for the Denver SEO Speaker. In the morning I will be conducting SEO training to Denver roofing Contractors here in Denver. We will be covering website optimization, business blogging and incorporating social media to drive results to websites.
In the afternoon I'll be conducting some more SEO training to a group of Attorneys here in Denver. We have already optimized their website and the focus of this SEO training session will be blogging and using social media.
If you are a small business located in Denver, Colorado call me for special pricing for in house Denver SEO Training.


text:
Watts River ist der Name folgender Flüsse in Australien:

* Watts River (Solly River), Nebenfluss des Solly Rivers in Tasmanien
 Watts River (Yarra River), Nebenfluss des Yarra River in Victoria

redpajama_set_name: RedPajamaWikipedia


3D is very intrusive. And does anyone really want it?
3D requires both the viewer change the way they view content, and it certainly causes producers to create shows that cater to the technology (which is expensive). Usually using the technology for the sake of the technology, not because it helps them tell better stories. We've already seen this ad nauseum in 3D movies, where there are things constantly being thrown at the screen or other visual gimmicks that really add nothing to the story or experience. Once the novelty of having things thrown at you wears off, where will 3D be? Probably where web3D is. Nowhere.
Back in 2000 I was part of a company that developed a web3D solution (Cycore's Cult 3D). Web3D was going to be the next big thing. Everyone wanted to see cars, shoes, mp3 players, and whatever else in 3D. As it turns out… they didn't. And because 3D is expensive to produce, web designers didn't want to use it. 8 photos of a shoe is a lot cheaper than creating a 3D model. And for viewers, photos have about the save effect as 3D. Neither gets you closer to actually trying the shoe on. Which is the problem with 3D TV.
3D TV doesn't really get you closer to feeling like you're part of the environment. You're sort of in the scene (and junk is flying at you), but the technology isn't anywhere close to being good enough to really suspend disbelief. So it just becomes a distraction to the story you're trying to tell.
Good stories is what makes good content. That's what people want to watch. 3D in it's current state (and for the foreseeable future), just doesn't add that much. And into this you have to consider changing viewing habits with more people watching shows on computer monitors and mobile devices. Yes, IF you're watching on a regular TV, there are some movies, particularly kids movies, that benefit. Games will probably benefit, and maybe there's some uses in sports (assuming you're willing to hang out with your buddies wearing 3D glasses). But mostly it's a gimmick and I think it's going to be a very hard sell to get people to care about it beyond the occassional kid movie or game.
Previous PostBeauty Box: Make everyone look beautiful.Next PostBeauty Box model shoot.
Problem now is PS3 fanboys think it is the next best thing… why? Cos Sony says so.
Just another ploy by Sony to sell more TVs. Convince all the PS3 owners out there they need one by giving the PS3 an update to support 3D. Very clever Sony.
In reality playing games in 3D is nothing new and you've been able to buy 3D shutter glasses for PC for years. It really isn't all that impressive.
Considering it's just 2D images being shuffled to create an illusion.
Why didn't manufacturers offering this gimmick in models 12-24 months ago when most of us upgraded to true HD TVs?
Remember Virtual Reality Head Sets in the 90s? Where are they now?
And what happened to last years hype about Laser TVs and then OLED TVs?
HD-CD, SA-CD and DVD-A… They were all supposed to replace CD-A.
Batman Arkham Asylum gives you 3d glasses that work on ANY tv, so why do we need to waste money on "special" tvs for 3D anyway? I'm inclined to believe there's nothing different about the TV other than they say 3D on them.


The Bani Yas is one of the most highly regarded tribes of Southern Arabia. Its origin can be traced back to Yas Bin Amer, whose tribe came from the tribe of Nizar bin Mayid bin Adnan.
originally centered in the Liwa oasis. Traditionally the members of the Al Bu Falah tribe "spent the winter with their camels in the desert, and many of them went pearling during the summer in the boats of other Bani Yas. The Al Bu Falah were the first to acquire property in the Buraimi oasis, and the members of the ruling family have systematically continued this policy until now.
The Al Maktoum family, a part of the highly regarded Al Bu Falasah section of the Bani Yas, continues to rule Dubai to this day."
date plantations. Making up much of the permanent or semi-settled population of the villages of the Liwa oasis was the Hawamil section. Many of its members owned goats or sheep, which kept them close to home. They also owned boats and had a share in the pearling industry. The Maharibah section, like the Hawamil, comprised both nomadic and settled members and many of its families were involved in the pearling industry. They owned a small fleet of 40 pearling boats.
The Maharibah section, like the Hawamil, comprised both nomadic and settled members and many of its families were involved in the pearling industry. They owned a small fleet of 40 pearling boats. The Al Mishaghin, a sub-section of the Al Bu Muhair section, was prevalent in Dubai. It was a small group of predominately Bedouin families.
أThe Sudan, on the other hand, was a large section spread out along the entire coast. Dependent on the sea for their livelihood, the members of the Sudan took an active role in pearling, fishing and trading.
"This tribal confederation was the basis for the creation of a nation-state within a large and geographically very varied territory. The coherence of the confederation was due to certain characteristics of the Bani Yas. First of all, the subsections and allied groups did not live separate existences; they shared, mingled and intermarried in the villages of the Liwa, they had arrangements by which the nomads of one section cared for the camels of another section, and those who had no pearling boats of their own went on the boats of others. ".
وكecondly, most families of the Bani Yas had some members living permanently in Abu Dhabi town, so that all the sections mixed there easily at all times." As befits a tribe from which so many noble families have come, the members of the Bani Yas tribe are well known for their patronage of, and involvement in, the literary arts. They are also renowned for their generosity, hospitality and chivalry, as were their Bedouin forefathers.


text:
Volume 39, Issue 2, January 2002 DOI: 10.1016/S0735-1097(01)01737-5
Clinical study: coronary artery disease
High coronary artery calcium scores pose an extremely elevated risk for hard events
Roberto Wayhs, Allan Zelinger and Paolo Raggi
vol. 39 no. 2 225-230
Published online January 16, 2002.
Roberto Wayhs, MD∗,
Allan Zelinger, MD, FACC∗ and
Paolo Raggi, MD, FACC†,* (praggi{at}tulane.edu)
∗
↵*Reprint requests and correspondence:
Dr. Paolo Raggi, Tulane University School of Medicine, 1430 Tulane Avenue, SL-48, New Orleans, Louisiana 70112, USA.
Presented at the 72nd Annual Scientific Meeting of the American College of Cardiology, Orlando, Florida, March 18 to 21, 2001.
Objectives We sought to assess the natural history of a cohort of asymptomatic individuals with very high (≥1,000) calcium scores (CSs) on a screening electron beam tomography (EBT) not submitted to further testing after the initial scan. We also compared the outcome of our prospective cohort with that of historical controls with severe abnormalities on myocardial perfusion imaging (MPI).
Background Coronary calcium detected on EBT imaging has been shown to correlate with the total plaque burden. However, there is still controversy as to the prognostic significance of calcium, as some investigators believe that the presence of coronary calcification may stabilize the atherosclerotic plaque.
Methods Ninety-eight asymptomatic subjects (mean age: 62 ± 10) were followed for an average of 17 ± 11 months (range: 4 to 36 months) after undergoing EBT screening for the occurrence of hard coronary events (HCEs), defined as myocardial infarction or coronary death. All patients had an initial CS ≥1,000, and in none did the results of the EBT screening lead to further invasive or non-invasive testing.
Results During the follow-up period, 35 patients (36%) suffered an HCE. All events were recorded in the first 28 months of follow-up. Subjects with HCEs had higher initial CSs than subjects not suffering HCEs (1,561 ± 270 vs. 1,199 ± 200, p < 0.001). The annualized event rate in subjects with a CS ≥1,000 was significantly greater than that of historical controls with severe perfusion abnormalities on MPI (25% vs. 7.4%, respectively; p < 0.0001).
Conclusions A high CS (≥1,000) on a screening EBT in an asymptomatic person portends a very high risk of an HCE in the short term. This risk appears to be greater than the risk associated with a severe perfusion abnormality on MPI.
Histopathologic studies have demonstrated the correlation of coronary artery calcification with the presence of atherosclerosis (1,2), and there appears to be a modest relationship between the extent of coronary artery calcification and severity of luminal stenosis (3–5). Angiography (6,7)and intravascular ultrasound (8,9)have demonstrated this relationship, and in spite of the lack of a site-by-site correspondence of calcification and luminal stenosis (10), a high calcium score (CS) predicts the presence of obstructive luminal disease, as demonstrated by single photon emission computed tomography (SPECT) imaging (11), with good reliability. Nonetheless, neither the severity nor the site of a vessel obstruction detected at angiography can be used to predict the occurrence of myocardial infarction (MI) or cardiac death (hard coronary events [HCEs]) (12,13). On the contrary, plaque burden appears to be a better determinant of future coronary events (14–16). Nuclear myocardial perfusion imaging and stress echocardiography are invaluable in detecting the presence of obstructive coronary stenosis. However, though very helpful to assess abnormal myocardial perfusion and its attendant prognosis, these imaging modalities cannot be used to estimate the total plaque burden. On the contrary, electron beam tomography (EBT) is an anatomic test employed to visualize the presence of plaque noninvasively.
Much controversy still surrounds the role of coronary calcification for the prediction of coronary events. Several published reports support the view that selected asymptomatic and symptomatic individuals with coronary calcium on a screening EBT scan are at high risk for development of clinical events (17–21). Prior American College of Cardiology/American Heart Association guidelines affirm the strong negative predictive value of a normal EBT, although they are less supportive of the positive predictive value of coronary calcification (22).
In this observational prospective study, we sought to determine the incidence of HCEs, defined as MI or death, in a cohort of asymptomatic individuals with high CSs (≥1,000) who did not undergo initial stress testing or coronary angiography driven by the results of the EBT screening procedure. To gauge the prognostic significance of these high CSs, indicative of an extensive plaque burden, we compared the event rate recorded in our cohort with that reported in the literature for symptomatic patients with severe abnormalities on myocardial functional studies.
Patient population
Data gathering started after study approval by the Medical Investigation Committee in our institution. All records for asymptomatic subjects submitted to EBT scanning during the period of June 1, 1996, to March 30, 1999, were reviewed. To be entered in the database, individuals had to be asymptomatic for cardiovascular disease and have no prior history of coronary artery disease (CAD). Furthermore, all patients had to have an initial CS ≥1,000 (Agatston method) (23). Individuals whose EBT results triggered further cardiovascular testing, including functional testing or angiography, were excluded from the final analysis.
A total of 104 asymptomatic subjects with a CS ≥1,000 were identified. We could not obtain follow-up information on two subjects, and four patients underwent interventions triggered by their EBT results and were excluded from the analysis. Therefore, our final sample included 98 patients.
Information regarding the patients' demographics, past medical history and clinical data were obtained through questionnaires distributed at the time of the initial EBT screening and—where available—medical record review. The accuracy of the medical records was confirmed at the time of patients' first interview. The information we collected regarded only the presence of categorical risk factors, and most risk factors were self-reported by the individuals undergoing EBT testing. No continuous variables were obtained. Systemic arterial hypertension was defined as current use of anti-hypertensive medications or known but untreated hypertension. Current smoking or cessation of smoking within three months of testing was defined as positive smoking status. Hypercholesterolemia was defined as currently receiving cholesterol- lowering medications or the presence of known but untreated hypercholesterolemia. Patients receiving insulin or oral hypoglycemic agents were classified as diabetic.
Telephone surveys were conducted at 3, 6, 9, 12, 18, 24 and 36 months from enrollment to collect information regarding the occurrence of HCEs (MI and death). All events were verified by means of medical chart and death certificate review. If a patient suffered more than one HCE during the follow-up period (two consecutive MIs or MI followed by death), only the first event was counted. The time from EBT screening to first event was recorded in months, and patient-months were used as an estimate of event-free survival (patients-months were calculated as the sum of all event-free months/number of events). Enrollment ceased six months before the last telephone contact.
Electron beam tomography imaging was performed using an Imatron C-100 scanner (Imatron, South San Francisco, California), with a 3-mm slice thickness and 100-ms imaging time. Tomographic imaging was triggered at 80% of the R-to-R interval on the 12-lead electrocardiogram during two end-inspiratory breath-holding periods. This was done to ensure minimal motion artifact and image distortion.
Scoring of all calcified areas was performed using the standard methodology described by Agatston et al. (23). A single investigator (A.Z.) blinded to the clinical data reviewed all EBT studies and confirmed the CSs. We did not consider it necessary to measure intra-reader scoring variability, because the latter is negligible with CSs in the range we selected (24).
Categorical variables were compared using the Fischer exact test, and continuous variables were compared using the Student ttest. Demographic data were compared using the likelihood ratio derived from chi-square. Curves describing the probability of event-free survival were obtained by plotting the number of patients free of events at each follow-up point. A patient who suffered an event at any point continued to be counted in the event group at the next follow-up. All calculations of significance were two-tailed, and a p < 0.05 was deemed necessary to achieve significance.
A MEDLINE search was conducted to identify recent publications that reported on hard outcome of patients found to have severe abnormalities on myocardial perfusion imaging (MPI) or stress echocardiography. Because such abnormalities probably point to the presence of multifocal obstructive disease, we considered these historical controls as plausible matches for our patients with extensive coronary artery calcification.
The clinical characteristics of the subjects submitted to EBT screening are shown in Table 1.The majority of our patients were self-referred, and only a small number were referred by primary care physicians. Of the original 104 patients screened, two patients could not be reached for follow-up and were excluded. Four patients underwent cardiac catheterization after the EBT study. Two of these patients underwent percutaneous coronary angioplasty with stent placement, and one underwent coronary bypass surgery, while the fourth patient was treated medically. These four patients were also excluded from analysis. The remaining 98 patients were followed for an average of 17 ± 11 months (range: 4 to 36 months). The average CS for the entire cohort was 1,328 ± 287 (range: 1,000 to 2,010).
Clinical Characteristics of Study Patients
In total, we recorded 35 HCEs during the follow-up period. The mean age of patients with and without events during follow-up was not statistically different (61 ± 9 years and 63 ± 8 years, respectively, p = NS). However, the CSs of patients who sustained an HCE during the follow-up period was significantly greater than that of patients who did not (1,561 ± 270 vs. 1,199 ± 200, p < 0.001). Treatment with HmG-CoA reductase inhibitors was employed at any time before or after the screening EBT scan in 27% of the patients without an HCE and 26% of the patients with an HCE (p = NS). The same was true of therapy with beta-adrenergic blocking agents (24% vs. 20%, p = NS).
Cardiac mortality comprised 12 events: seven deaths were not preceded by a documented MI and happened an average of 19 ± 7 months from the screening EBT. The remaining five deaths were preceded by an MI suffered after an average time of 15 ± 6 months from the screening EBT. Death in these five cases occurred within zero to nine months from MI. Of the 12 patients who died, two patients had developed angina after a follow-up of six and eight months from EBT screening and underwent percutaneous coronary artery angioplasty at that time. Both of these patients died within five months of the procedure.
Morbid events included 23 nonfatal MIs recorded at an average of 18 ± 7 months from the screening EBT. There was no statistical difference in age and CS between the patients who suffered a fatal cardiac event and those who suffered a nonfatal MI (mean age: 61 ± 10 years for both groups and CS = 1,555 ± 214 vs. 1,563 ± 270, respectively; p = NS).
The annual absolute event rate for the entire cohort was 25%. In the study group as a whole, there was one event per 30.7 patient-months. For patients with a CS ≥1,500, the event rate was 1 per 24.5 patient-months. The difference in time-course between these two patient groups was statistically significant (p < 0.05). If only the patients who died were considered, the time to event was further reduced to 18.4 patient-months, and this too was statistically significant (p < 0.02) compared with the entire cohort.
Although the longest follow-up was 36 months, all HCEs occurred within 28 months from the time of EBT screening. Eleven patients were followed for longer than 28 months and up to 36 months but suffered no events. A curve describing the probability of event-free survival at each individual follow-up time is presented in Figure 1.
Probability of survival free of events in 98 consecutive asymptomatic subjects with a calcium score ≥1,000 on a screening electron beam tomography scan.
Comparison with historical controls
Our cohort showed a greater mortality and morbidity than historical controls submitted to functional stress imaging. Hachamovitch et al. (25)published data on the outcome of 2,200 consecutive patients with no prior history of CAD submitted to dual isotope SPECT imaging. All patients had symptoms, either atypical (70%) or typical (30%). During a mean follow-up of 566 ± 142 days, the HCE rate for patients with severely abnormal scan results was 10% (approximately 7% per year). The same group reported on the outcome of 5,183 patients followed for an average of 1.8 years after having been submitted to MPI (26). Of 5,183 patients, 64% had experienced either typical or atypical angina before testing, and 21% had suffered an MI. The yearly HCE rate was 7.1% in the patients with severely abnormal scan results and 12.3% for all patients with moderately and severely abnormal test results considered together. An extensive review of outcome studies performed in a variety of patients submitted to MPI showed an average annual HCE rate of 7.4% in individuals with abnormal scans and a rate of 0.6% in subjects with normal scans (27).
Elhendy et al. (28)studied a group of 563 high-risk diabetic patients by means of exercise echocardiography. Again, over two thirds of the patients studied had anginal symptoms or had suffered a prior MI. Patients with inducible wall motion abnormalities in multiple territories showed an HCE rate of 32.8% at five years (approximately 7% annualized event rate).
In every comparison, our asymptomatic subjects with CSs ≥1,000 demonstrated a statistically greater event rate (p < 0.0001) than patients with severely abnormal stress test results.
This study shows that the presence of a high coronary artery CS on EBT imaging in asymptomatic patients portends a very high risk for HCE. Previous EBT outcome studies included very few cases with a CS ≥1,000, and this is the first large series of asymptomatic patients with such score values. Although medical treatment of these individuals may have been intensified by the detection of extensive coronary calcification, the screening test was not immediately followed by any coronary intervention or further risk stratification by means of functional studies. Stress testing or coronary interventions were performed during the follow-up procedure only as warranted by clinical circumstances such as the appearance of angina. Therefore, this analysis represents a true natural history of extensive asymptomatic CAD.
Prior evidence of prognostic role of calcification
Margolis et al. (29)reported that symptomatic patients with coronary calcification seen during angiography had a five-year survival rate of 58% compared with 87% for patients without calcification. They further noted that the prognostic significance of coronary artery calcification appeared to be independent of information obtained during angiography. The presence of calcification of the coronary arteries on fluoroscopy was an independent predictor of death and MI in a study by Detrano et al. (30). These authors reported on the outcome of 1,461 asymptomatic individuals followed for 55 months after having undergone fluoroscopy screening to identify coronary artery calcification. During the follow-up period, there were 35 coronary deaths and 43 nonfatal MIs. Subjects with calcification in more than one vessel were 2.2 times more likely to suffer an event than subjects with one or no calcified vessels. Furthermore, the number of calcified vessels was an independent predictor of events. Given the much lower sensitivity of fluoroscopy compared with EBT, it is plausible that the calcifications seen on fluoroscopy by Margolis et al. (29)and Detrano et al. (30)were rather extensive.
The value of EBT screening for coronary calcium and as a predictor of cardiovascular events is still being disputed (22)and is undergoing intense investigation. In 1,172 self-referred asymptomatic individuals, the presence of a CS >160 was associated with an odds ratio of 22 for either developing an HCE or requiring a coronary revascularization procedure after an average of 3.6 years from EBT screening (19). A recent trial showed that a CS >75th percentile in asymptomatic physician-referred individuals is highly predictive of the occurrence of HCEs in the short term (17). Because a CS ≥1,000 places an individual in at least the 75th percentile, and perhaps even above the 90th percentile for most adults of both genders (31), our analysis falls in line with other studies that proved these relative score thresholds to be indicative of substantially elevated cardiovascular risk (17).
Mechanisms explaining vascular fragility
Several explanations could be offered for the occurrence of the extremely elevated event rate we observed. The most plausible is that extensive calcification of the coronary arteries indicates disseminated atherosclerosis. The calcified areas should not necessarily be considered the areas at immediate risk of sudden rupture or erosion but rather markers for the presence of unstable atherosclerotic plaques admixed between the more heavily calcified areas (1). A recent report by Huang et al. (32)supports the hypothesis that calcified plaques are less prone to rupture. These investigators conducted an in vitro study of the elastic properties of 10 stable plaques and 10 plaques that had undergone rupture before the patient's death. The authors concluded that calcified atherosclerotic plaques were more stable and less prone to rupture than plaques with a large lipid pool. These results, however, are in contrast with other experimental data produced with in vitro simulations by Veress et al. (33), who suggested that atherosclerotic plaques show an increased tendency to rupture when a calcium layer is added to a stable plaque. Furthermore, Demer (34)demonstrated an extreme fragility of calcified rabbit coronary arteries exposed in vitro to stretching with angioplasty balloons, while Fitzgerald et al. (35)observed a greater propensity to dissection during in vivo angioplasty of calcified human coronary arteries than noncalcified arteries (35). Finally, Mascola et al. (36)reported that the culprit coronary artery responsible for an acute event is most often calcified. In the latter analysis, the investigators concluded that the weight of the evidence favors the concept that coronary calcification is an important risk factor for the development of HCEs. Nonetheless, although the culprit artery is more often calcified, the specific region of plaque rupture or erosion might not be.
Significance of plaque burden
Although the issue of the relationship between arterial fragility and focal calcification remains controversial, it is clear that the total atherosclerotic plaque burden is a more determinative factor in the occurrence of HCEs than the presence of focal luminal stenoses (14,37). Goldstein et al. (14)showed that the presence of multiple complex plaques predicted the recurrence of acute coronary events that did not necessarily occur at the site of the most severe obstruction. This happened in spite of a more frequent use of coronary revascularization procedures in patients with multiple complex plaques.
The presence of multiple perfusion abnormalities on a myocardial perfusion study in patients with anginal symptoms indicates the development of obstructive luminal disease, which may well be caused by stable plaques not prone to rupture. Thus, functional abnormalities, although very prognostically important (38), may not necessarily carry as severe a prognosis as extensive atherosclerotic disease. On the other hand, the actual risk of an HCE in patients with severely abnormal functional tests could be greater than reported in the literature. In fact, it is likely that the majority of individuals with very abnormal test results would undergo coronary angiography and revascularization early after test completion. This might limit the occurrence of events, although large-scale randomized trials have shown that improved event-free survival can be achieved only in specific subsets of symptomatic patients submitted to elective revascularization procedures (39–41).
Our study was subject to a few limitations. The size of our patient cohort was small, although this is the largest published series of asymptomatic individuals with a CS ≥1,000 to date. Today it would be extremely rare to find individuals with a CS ≥1,000 not submitted to further testing, because the interest and attention of clinicians to the prognostic significance of coronary calcification has exponentially increased since the time of our study inception. The majority of patients we followed were self-referred. This might represent a more health conscious group of individuals or a group of subjects that, despite the declared absence of chest discomfort, actually suffered atypical symptoms and wondered about their nature. This preselection bias could be overcome only by conducting a population-based study where no intervention after the EBT screening is allowed. This approach is becoming less practical and ethical as more outcome studies supporting the negative impact of coronary calcification are published. The design of our study did not include the measurement of markers of inflammation such as high sensitivity C-reactive protein, an important marker of risk of future coronary events (42–44). It is conceivable that the individuals who suffered an event in our study might have had the highest C-reactive protein levels, therefore representing a more unstable group. Interestingly, all events happened in the first 28 months of follow-up, with no event registered after that period. In theory, it is plausible that the unstable patients suffered an event earlier, while in the remaining patients calcification of the coronary arteries indicated the presence of a more stable form of disease.
The prognostic significance of coronary calcification is undergoing intense investigation, and it is slowly becoming accepted as an additional significant risk factor for coronary heart disease. Our study shows that the presence of high CSs (≥1,000) on a screening EBT in asymptomatic persons portends a very high risk of HCEs. The risk seems to be greater than severe abnormalities seen on functional myocardial studies conducted in symptomatic patients. These data may need to be taken into consideration when designing randomized trials of asymptomatic individuals expected to undergo EBT screening. Patients with such high scores deserve aggressive medical management and further risk stratification with serologic testing for markers of inflammation, and they are likely to require functional stress testing to demonstrate the presence of inducible myocardial ischemia.
electron beam tomography
hard cardiac event
single photon emission computed tomography
Received July 26, 2001.
Rumberger J.A.,
Simons D.B.,
Fitzpatrick L.A.,
Sheedy P.F.,
Schwartz R.S.
(1995) Coronary artery calcium area by electron beam computed tomography and coronary atherosclerotic plaque area: a histopathologic correlative study. Circulation 92:2157–2162.
Mautner G.C.,
Mautner S.L.,
Froehlich J.,
(1994) Coronary artery calcification: assessment with electron beam computed tomography and histomorphometric correlation. Radiology 192:619–623.
Breen J.F.,
(1997) Electron beam computed tomography calcium score cutpoints and severity of associated angiographic luminal stenosis. J Am Coll Cardiol 29:1542–1548.
Bielak L.F.,
Schwartz R.S.,
Peyser P.A.
(2000) Probabilistic model for prediction of angiographically defined obstructive coronary artery disease using electron beam computed tomography calcium score strata. Circulation 102:380–385.
Haberl R.,
Becker A.,
Leber A.,
(2001) Correlation of coronary calcification and angiographically documented stenosis in patients with suspected coronary artery disease: results of 1,764 patients. J Am Coll Cardiol 37:451–457.
Guerci A.D.,
Spadaro L.A.,
Goodman K.J.,
(1998) Comparison of electron beam computed tomography scanning and conventional risk factor assessment in the prediction of angiographic coronary artery disease. J Am Coll Cardiol 32:673–679.
Schmermund A.,
Denktas A.E.,
(1999) Independent and incremental value of coronary artery calcium for predicting the extent of angiographic coronary artery disease. J Am Coll Cardiol 34:777–786.
Baumgart D.,
Gorge G.,
(1997) Coronary artery calcium in acute coronary syndromes: a comparative study of electron-beam computed tomography, coronary angiography, and intracoronary ultrasound in survivors of acute myocardial infarction and unstable angina. Circulation 96:1461–1469.
George G.,
(1997) Comparison of electron beam computed tomography with intracoronary ultrasound and coronary angiography for coronary atherosclerosis. J Am Coll Cardiol 30:57–64.
Kajinami K.,
Seki H.,
Takekoshi N.,
Mabuchi H.
(1997) Coronary calcium and coronary atherosclerosis: site by site comparative morphologic study of electron beam computed tomography and coronary angiography. J Am Coll Cardiol 29:1549–1556.
He Z.X.,
Hedricks T.D.,
Pratt C.M.,
(2000) Severity of coronary artery calcification by electron beam computed tomography predicts silent myocardial ischemia. Circulation 101:244–251.
Falk E.,
Shah P.K.,
Fuster V.
(1995) Coronary plaque disruption. Circulation 92:657–671.
Ambrose J.A.,
Tannenbaum M.A.,
Alexopoulos D.,
(1988) Angiographic progression of coronary artery disease and the development of myocardial infarction. J Am Coll Cardiol 12:56–62.
Goldstein J.A.,
Demetriou D.,
Grines C.L.,
Pica M.,
Shoukfeh M.,
O'Neill W.W.
(2000) Multiple complex coronary plaques in patients with acute myocardial infarction. N Engl J Med 343:915–922.
Deanfield J.E.
(1990) Total ischemic burden in patients with coronary artery disease. Cardiovasc Drugs Ther 1990 (Suppl 4):833–839.
Deedwania P.C.
(2001) Silent ischemia predicts poor outcome in high-risk healthy men. J Am Coll Cardiol 38:80–83.
Raggi P.,
Callister T.Q.,
Cooil B.,
(2000) Identification of patients at increased risk of first unheralded acute myocardial infarction by electron beam computed tomography. Circulation 101:850–855.
Arad Y.,
Goodman K.,
(1996) Predictive value of electron beam computed tomography of the coronary arteries: 19-month follow-up of 1,173 asymptomatic subjects. Circulation 93:1951–1953.
Newstein D.,
Guerci A.D.
(2000) Prediction of coronary events with electron beam computed tomography. J Am Coll Cardiol 36:1253–1260.
O'Malley P.G.,
Taylor A.J.,
Jackson J.L.,
Doherty T.M.,
Detrano R.C.
(2000) Prognostic value of coronary electron beam computed tomography for coronary heart disease events in asymptomatic population. Am J Cardiol 85:945–948.
Wong N.D.,
Hsu J.C.,
Detrano R.C.,
Diamond G.,
Eisenberg H.,
Gardin J.M.
(2000) Coronary artery calcium evaluation by electron beam computed tomography and its relation to new cardiovascular events. Am J Cardiol 86:495–498.
O'Rourke R.A.,
Brundage B.H.,
Froelicher V.F.,
(2000) American College of Cardiology/American Heart Association expert consensus document on electron beam computed tomography for the diagnosis of coronary artery disease (Committee on Electron Beam Computed Tomography). Circulation 102:126–140.
Agatson A.S.,
Janowitz W.R.,
Hildner F.J.,
(1990) Quantification of coronary artery calcium using ultrafast computed tomography. J Am Coll Cardiol 15:827–832.
Kaufmann R.B.,
Sheedy P.F. Jr.,
(1994) Detection of heart calcification with electron beam CT: interobserver and intraobserver reliability for scoring quantification. Radiology 190:347–523.
Hachamovitch R.,
Berman D.S.,
Kiat H.,
(1996) Exercise myocardial perfusion SPECT in patients without known coronary artery disease: incremental prognostic value and use in risk stratification. Circulation 93:905–914.
Shaw L.J.,
(1998) Incremental prognostic value of myocardial perfusion single photon emission computed tomography for the prediction of cardiac death: differential stratification for risk of cardiac death and myocardial infarction. Circulation 97:535–543.
Iskander S.,
Iskandrian A.E.
(1998) Risk assessment using single-photon emission computed tomographic technetium-99m sestamibi imaging. J Am Coll Cardiol 32:57–62.
Elhendy A.,
Arruda A.M.,
Mahoney D.W.,
Pellikka P.A.
(2001) Prognostic stratification of diabetic patients by exercise echocardiography. J Am Coll Cardiol 37:1551–1557.
Margolis J.R.,
Chen J.T.,
Kong Y.,
Peter R.H.,
Behar V.S.,
Kisslo J.A.
(1980) The diagnostic and prognostic significance of coronary artery calcification: a report of 800 cases. Radiology 137:609–616.
Shavelle R.
(1997) Prognostic significance of coronary calcific deposits in asymptomatic high-risk subjects. Am J Med 102:344–349.
Hoff J.A.,
Chomka E.V.,
Krainik A.J.,
Daviglus M.,
Rich S.,
Kondos G.T.
(2001) Age and gender distributions of coronary artery calcium detected by electron beam tomography in 35,246 adults. Am J Cardiol 87:1335–1339.
Huang H.,
Virmani R.,
Younis H.,
Burke A.P.,
Kamm R.D.,
Lee R.T.
(2001) The impact of calcification on the biomechanical stability of atherosclerotic plaques. Circulation 103:1051–1056.
Veress A.I.,
Cornhill J.F.,
Herderick E.E.,
Thomas J.D.
(1998) Age-related development of atherosclerotic plaque stress: a population-based finite-element analysis. Coron Artery Dis 9:13–19.
Demer L.L.
(1991) Effect of calcification on in vivo mechanical response of rabbit arteries to balloon dilation. Circulation 83:2083–2093.
Fitzgerald P.J.,
Ports T.A.,
Yock P.G.
(1992) Contribution of localized calcium deposits to dissection after angioplasty: an observational study using intravascular ultrasound. Circulation 86:64–70.
Mascola A.,
Ko J.,
Bakhsheshi H.,
Budoff M.J.
(2000) Electron beam tomography comparison of culprit and non-culprit coronary arteries in patients with acute myocardial infarction. Am J Cardiol 85:1357–1359.
Grundy S.M.
(1999) Primary prevention of coronary artery disease: integrating risk assessment with intervention. Circulation 100:988–998.
Olmos L.I.,
Dakik H.,
Gordon R.,
(1998) Long-term prognostic value of exercise echocardiography compared with exercise 201 Tl, ECG, and clinical variables in patients evaluated for coronary artery disease. Circulation 98:2679–2686.
Bonow R.O.,
Epstein S.E.
(1985) Indications for coronary artery bypass surgery in patients with chronic angina pectoris: implications of the multicenter randomized trials. Circulation 72:V23–30.
RITA-2 Trial Participants
(1997) Coronary angioplasty versus medical therapy for angina: the second Randomised Intervention Treatment of Angina (RITA-2) trial. Lancet 350:461–468.
Ellis S.G.,
Fisher L.,
Dushman-Ellis S.,
(1989) Comparison of coronary angioplasty with medical treatment for single- and double-vessel coronary disease with left anterior descending coronary involvement: long-term outcome based on an Emory-CASS registry study. Am Heart J 118:208–220.
Ridker P.M.,
Cushman M.,
Stampfer M.J.,
Tracy R.P.,
Hennekens C.H.
(1997) Inflammation, aspirin, and the risk of cardiovascular disease in apparently healthy men. N Engl J Med 336:973–979.
Glynn R.J.,
(1998) C-reactive protein adds to the predictive value of total and HDL cholesterol in determining risk of first myocardial infarction. Circulation 97:2007–2011.
Rifai N.,
Clearfield M.,
(2001) Measurement of C-reactive protein for the targeting of statin therapy in the primary prevention of acute coronary for the Air Force/Texas coronary atherosclerosis prevention study investigators. N Engl J Med 344:1959–1965.
You are going to email the following High coronary artery calcium scores pose an extremely elevated risk for hard events
Roberto Wayhs, Allan Zelinger, Paolo Raggi
J Am Coll Cardiol. 2002 Jan, 39 (2) 225-230.