2

テクスチャをPolygonMorphに取り込む必要がありますが、これらには色/塗りつぶしとしてInfiniteFormが必要なようです。

後でPolygonMorphを回転させる必要があり、PolygonMorphを移動すると、表示されるテクスチャに副作用が生じるため、InfiniteFormは解決策ではありません。
挿入されたテクスチャもスケーリングできると非常に便利です。

既存のPolygonMorphを置き換える(または少なくともPolygonMorphの形状を維持する)ことなく、これをどのように行いますか?

4

1 に答える 1

1

ここにあなたの問題に対する別の考えがあります。このソリューションには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.! !
于 2011-01-11T22:51:11.710 に答える