ここにあなたの問題に対する別の考えがあります。このソリューションには2つのフェーズが含まれます。
フェーズ1:(drawTextures)BitBltを使用して、フォームにテクスチャタイルを入力します。フォームは、テクスチャリングと呼ばれるインスタンス変数に格納されます。このフォームはフェーズ2でクリップされます
フェーズ2:(clipTextures)ここで、ポリゴンfilledFormを使用してポリゴンのような形状のフォームを作成します。その後、これを完全な黒のフォームから差し引きます。これで、ポリゴンの形状がネガティブになりました。これで、テクスチャリングをクリップします。これで、イメージモーフを作成して、ポリゴンまたはそれを使ってやりたいことを何でも追加できます。
残念ながら、filledFormの実装では凸型の形状を処理できません。したがって、ポリゴンがどのように見えるかに注意してください。
このソリューションは非常に高速で、実行時に適用することもできます。ポリゴンの形状を10ミリ秒ごとに変更し、レンダリングを細かくします。
!PgiTexturedMorph methodsFor: 'graphics' stamp: 'pre 2/12/2011 13:30:15.156'!
drawTexture
| textureForm aTexture aBitBlt |
textureForm := Form extent: (self shape extent) depth: 32.
aTexture := self baseImage deepCopy .
textureForm := Form extent: (self shape extent) depth: 32.
(0 to: ((textureForm extent x) / (aTexture extent x))) do: [ :eachX |
(0 to: ((textureForm extent y) / (aTexture extent y))) do: [ :eachY |
aBitBlt := BitBlt destForm: textureForm
sourceForm: aTexture
fillColor: nil
combinationRule: 7
destOrigin: (eachX * (aTexture extent x))@(eachY *(aTexture extent y))
sourceOrigin: 0@0
extent: (aTexture extent)
clipRect: (textureForm computeBoundingBox).
aBitBlt copyBits.
]].
self texturing: textureForm.! !
!PgiTexturedMorph methodsFor: 'graphics' stamp: 'pre!
clipTextures
| clippingForm aBitBlt |
clippingForm := (Form extent: (self shape extent + (1@0))) fillBlack.
aBitBlt := BitBlt destForm: clippingForm
sourceForm: (self shape filledForm)
fillColor: nil
combinationRule: 6
destOrigin: 0@0
sourceOrigin: 0@0
extent: (self shape extent)
clipRect: (clippingForm computeBoundingBox).
aBitBlt copyBits.
aBitBlt := BitBlt destForm: (self texturing)
sourceForm: (clippingForm )
fillColor: nil
combinationRule: 17
destOrigin: 0@0
sourceOrigin: 0@0
extent: (clippingForm extent)
clipRect: (self texturing computeBoundingBox).
aBitBlt copyBits.
self texturePart image: (self texturing).
self texturePart changed.! !