TPointer


Croquet-Teapot

Comment:

The TPointer object is the user pointer control. It is used to communicate user requests to the components. It is a subclassed TRay. The variables it uses are:

camera - this is the camera that the pointer is attached to. 
event2d - just the morphic event being passed in if we are working with a TMorph texture.
pointerXY - is the 2d location of the mouse.
keySelectedObject - if we pressed a key over an object, this keeps track of same
isDown - indicates that the mouse button is currently being pressed.
tool - a user tool, pretty minimal at the moment. Ultimately, the user will be able to pick up new tools and wield them.

Hierarchy:

ProtoObject
Object
TObject
TFrame
TRay
TPointer

Summary:

instance variables:

avatar event2D isDown keySelectedObject pointerXY pseudoCamera spellClass tool

methods:

instance class
*Jana-Script accessing events fileIn/Out initialize testing instance creation

Detail:

instance variables:

avatar
event2D
isDown
keySelectedObject
pointerXY
pseudoCamera
spellClass
tool

instance methods:

*Jana-Script
isPointerDown

	^isDown
isPointerDownOn: aFrame

	isDown ifFalse:[^false].
	^self selectedObject == aFrame

accessing
avatar


	^ avatar.
avatar: av


	avatar _ av.
camera


	^ pseudoCamera. "This is not the real camera, just has copies of key values"
camera: cm


	pseudoCamera _ cm.
isDown


	^ isDown.
localTransform: trans


	super localTransform: trans.
	tool ifNotNil:[ tool localTransform: trans.].
pointerXY


	^ pointerXY.
pointerXY: pnt


	pointerXY _ pnt.
setSpell: sc


	spellClass _ sc.
	tool ifNotNil:[tool setSpell: true].
tool


	^ tool.
tool: tl


	tool ifNotNil:[self removeChild: tool].
	tool _ tl.
	tool ifNotNil:[self addChild: tool].

events
controlKeyPressed

	^event2D controlKeyPressed
dropFiles: aFile event: evt

	| frame |
	self event2D: evt.
	(frame _ self selectedObject)
		ifNotNil: [frame isComponent
				ifTrue: [(frame handlesPointerOver: self)
						ifTrue: [frame dropFiles: aFile pointer: self]]]
		ifNil: [ Croquet world activeCamera makePicture: aFile].
event2D


	^ event2D.
event2D: e2d


	event2D _ e2d.
keyDown: evt


	| frame |
	self event2D: evt.

	(frame := self selectedObject) ifNotNil:[
		frame isComponent ifTrue:[
			(frame handlesKeyboard: self) ifTrue:[
				keySelectedObject _ frame.
				frame keyDown: self.
			].
		.].
	].

keyStroke: evt


	| frame |
	self event2D: evt.

	(frame := self selectedObject) ifNotNil:[
		frame isComponent ifTrue:[
			(frame handlesKeyboard: self) ifTrue:[
				keySelectedObject _ frame.
				frame keyDown: self.
			].
		.].
	].

keyUp: evt

	
	self event2D: evt.

	keySelectedObject ifNotNil:[
		keySelectedObject isComponent ifTrue:[
			(keySelectedObject handlesKeyboard: self) ifTrue:[
				keySelectedObject keyUp: self.
				keySelectedObject _ nil.
			]]].
"	doSelect _ false."
pointerDown: evt

	| frame |
	self signal: #pointerDown with: self.
	self event2D: evt.
	isDown := true.
	(frame := self selectedObject) ifNotNil:[
		spellClass ifNil:[
			frame isComponent ifTrue:[
				(frame handlesPointerDown: self) ifTrue:[
					isDown _ true.
					tool ifNotNil:[tool pointerDown: self.].
					frame pointerDown: self.]] 
			ifFalse:[ ^ false.].
			]
		].
	doSelect _ false. "don't select anything while the pointer is down."
	frame ifNil:[ ^ false.].
	^ true.
pointerEnter: evt


	| frame |
	self event2D: evt.
	(frame := self selectedObject) ifNotNil:[
		frame isComponent ifTrue:[
			(frame handlesPointerOver: self) ifTrue:[
				frame pointerEnter: self.]]].
pointerLeave: evt


	| frame |
	self event2D: evt.
	(frame := self selectedObject) ifNotNil:[
		frame isComponent ifTrue:[
			(frame handlesPointerOver: self) ifTrue:[
				frame pointerLeave: self.]]].
pointerMove: evt


	| cf frame gt spt |
	self signal: #pointerMove with: self.
	self event2D: evt.
	(frame := self selectedObject) ifNotNil:[
		frame isComponent ifTrue:[
			(frame handlesPointerDown: self) ifTrue:[
				self testDistance: false.
				cf _ self currentFrame.
				cf ifNotNil:[
					cf pick: self.].
				tool ifNotNil:[tool pointerMove: self.].
				(spt _ self selectedParentTransform) ifNotNil:[
					gt _ self globalTransform.
					self globalTransform: (spt composeWith: (self localTransform)).
					frame pointerMove: self.
					self globalTransform: gt.] 
				ifNil: [ frame pointerMove: self.].
				self currentFrame: cf.
				self testDistance: true.]]].
"	popUpUp ifTrue:[
		selectedObject _ nil.
		self pointerPick: popUp.
		selectedObject = lastSelectedObject ifTrue:[
			selectedObject = popUp ifTrue:[popUp pointerOver: self].]
		ifFalse:[
				Smalltalk beep.
				lastSelectedObject _ selectedObject.
				selectedObject = popUp ifTrue:[popUp pointerEnter: self].
				lastSelectedObject = popUp ifTrue:[popUp pointerLeave: self].].]."
pointerOver: evt


	| frame |
	self event2D: evt.
	doSelect ifTrue:[
	(frame := self selectedObject) ifNotNil:[
		frame isComponent ifTrue:[
			(frame handlesPointerOver: self) ifTrue:[
				frame pointerOver: self.]]]].
pointerUp: evt

	| frame |
	self signal: #pointerUp with: self.
	self event2D: evt.
	spellClass ifNotNil:[
"need to test that the pointer is still over the object we are about to select here"
		spellClass castSpell: self.
		spellClass _ nil.
		tool ifNotNil:[tool setSpell: false.].
		doSelect _ true.
		self resetTotal.
		^ false.
		].
	isDown ifTrue:[
		isDown _ false.
		(frame := self selectedObject) ifNotNil:[
			frame isComponent ifTrue:[
				(frame handlesPointerDown: self) ifTrue:[
					isDown _ false.
					tool ifNotNil:[tool pointerUp:[self.].].
					frame pointerUp: self.]]]].
	doSelect _ true.
	self resetTotal.
shiftPressed

	^event2D shiftPressed
wantsKeyboard: evt

	| frame |
	(frame := self selectedObject) ifNotNil:[
		frame isComponent ifTrue:[
			(frame handlesKeyboard: self) ifTrue:[^true]]].
	^false

fileIn/Out
prepareToExportOn: exporter

	super prepareToExportOn: exporter.
	event2D := nil.

initialize
calcTransform: bounds z: zScreen

	| bCenter at up side cpointer |
" x and y are negated on purpose. Why? Because the z value should actually be negated as it is referring to a position in front of the camera (in the negative z direction) but anyone trying to do the math for TPointer will probably want to use a positive direction vector. OK? Get it? Essentially the math is wrong, but it is consistent. "
	bCenter _ bounds center.
	at _ (B3DVector3
				x: bCenter x - pointerXY x
				y: pointerXY y - bCenter y
				z: zScreen ) normalized.
	up _ B3DVector3 x: 0.0 y:1.0 z:0.0.
	side _ (up cross: at) normalized.
	up _ (at cross: side) normalized.

	cpointer _ B3DMatrix4x4 identity.
	cpointer at: 1 at: 1 put: side x.
	cpointer at: 1 at: 2 put: side y.
	cpointer at: 1 at: 3 put: side z.
	cpointer at: 2 at: 1 put: up x.
	cpointer at: 2 at: 2 put: up y.
	cpointer at: 2 at: 3 put: up z.
	cpointer at: 3 at: 1 put: at x.
	cpointer at: 3 at: 2 put: at y.
	cpointer at: 3 at: 3 put: at z.
	self localTransform: cpointer transposed.
initialize


	super initialize.
	isDown _ false.
	self visible: false.
	pseudoCamera _ TCamera new. "stand-in camera that has most properties of our real camera"
	^self

testing
isRay


"----- don't want to treat this is a normal ray because there is (usually) only one and it relies on the frustum culling where the base TRay objects are tested against everything -----"
	^ false.


class methods:

^top


- made by Dandelion -